2016-07-23 32 views
11

Próbuję obrócić obraz tak, aby pasował prawidłowo pod innym obrazem. Więc to, co usiłuję osiągnąć:Obracanie obrazuView zgodnie z ruchem wskazówek zegara przy użyciu ObjectAnimator

What I am trying to achieve

I to jest to, co jestem w stanie osiągnąć:

Currently achieved

To w zasadzie zawiera dwa ImageView z pierwszego zawierającego część nad podłogą i drugą z płytkami, które zakrywają podłogę.

Moim problemem jest to, że nie jestem w stanie animować obrazu płytek w kierunku zgodnym z ruchem wskazówek zegara, a także obracać widokiem wokół osi x, tak aby pasował do obrazu zawierającego część nad podłogą.

Używam ObjectAnimator do animowania mojego ImageView. Poniżej jest mój kod:

public class VisualizerFragment extends Fragment { 

ImageView image; 
FlipImageView image_back; 
@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    getActivity().setRequestedOrientation(
      ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); 

    View view = inflater.inflate(R.layout.fragment_visualizer, container, false); 
    image = (ImageView) view.findViewById(R.id.vs_image); 
    image_back = (FlipImageView) view.findViewById(R.id.vs_image_back); 

    Glide.with(getActivity()) 
      .load(R.drawable.floor3) 
      .centerCrop() 
      .fitCenter() 
      .listener(new RequestListener<Integer, GlideDrawable>() { 
       @Override 
       public boolean onException(Exception e, Integer model, Target<GlideDrawable> target, boolean isFirstResource) { 
        return false; 
       } 

       @Override 
       public boolean onResourceReady(GlideDrawable resource, Integer model, Target<GlideDrawable> target, boolean isFromMemoryCache, boolean isFirstResource) { 
        Bitmap bmp = BitmapFactory.decodeResource(getActivity().getResources(), R.drawable.i9004); 

        //crop image 
        Matrix matrix = new Matrix(); 
        matrix.postScale(1f, 1f); 
        Bitmap croppedBitmap = Bitmap.createBitmap(bmp, 0, 0,100, 100, matrix, true); 

        bmp = getRoundedCornerBitmap(croppedBitmap, getResources().getColor(R.color.line),0,1,getActivity()); 
        BitmapDrawable bitmapDrawable = new BitmapDrawable(bmp); 
        bitmapDrawable.setTileModeXY(Shader.TileMode.REPEAT, Shader.TileMode.REPEAT); 

        image_back.setDrawable(bitmapDrawable); 
        image_back.setFlippedDrawable(bitmapDrawable); 
        image_back.setFlipped(true); 
        image_back.toggleFlip(); 

        //rotate image 
        ObjectAnimator anim = (ObjectAnimator) AnimatorInflater.loadAnimator(getActivity(), R.animator.fliping); 
        anim.setTarget(image_back); 
        anim.setDuration(100); 
        anim.start(); 


        return false; 

       } 
      }) 
      .into(image); 


    return view; 
} 


public static Bitmap getRoundedCornerBitmap(Bitmap bitmap, int color, int cornerDips, int borderDips, Context context) { 
    Bitmap output = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), 
      Bitmap.Config.ARGB_8888); 
    Canvas canvas = new Canvas(output); 

    final int borderSizePx = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, (float) borderDips, 
      context.getResources().getDisplayMetrics()); 
    final int cornerSizePx = 0; 
    final Paint paint = new Paint(); 
    final Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight()); 
    final RectF rectF = new RectF(rect); 

    // prepare canvas for transfer 

    paint.setAntiAlias(true); 
    paint.setColor(0xFFFFFFFF); 
    paint.setStyle(Paint.Style.FILL); 
    canvas.drawARGB(0, 0, 0, 0); 
    canvas.drawRoundRect(rectF, cornerSizePx, cornerSizePx, paint); 

    // draw bitmap 
    paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN)); 
    canvas.drawBitmap(bitmap, rect, rect, paint); 


    // draw border 
    paint.setColor(color); 
    paint.setStyle(Paint.Style.STROKE); 
    paint.setStrokeWidth((float) borderSizePx); 
    canvas.drawRoundRect(rectF, cornerSizePx, cornerSizePx, paint); 

    return output; 
} 
} 

A poniżej jest moja fliping.xml wykorzystywane do animacji:

<?xml version="1.0" encoding="utf-8"?> 
<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android" 
    android:propertyName="rotationX" 
    android:valueFrom="20" 
    android:valueTo="50" 
    android:valueType="floatType" 
/> 
+0

Czy pojawia się błąd? Czy w ogóle się obraca, czy nic się nie dzieje? –

+0

Proszę cię nie rozumiem, przepraszam, mógłbyś rozwinąć więcej więcej – Elltz

+0

zobacz różnicę w obrazach .... pierwszy jest pożądany, a drugi jest wyprowadzany ... potrzebuje wyjścia jako pierwszy obraz –

Odpowiedz

0

Try poniższym kodzie po prostu ładuje obraz

 ObjectAnimator imageViewObjectAnimator = ObjectAnimator.ofFloat(imageview , 
       "rotation", 20f, 50f); 
     imageViewObjectAnimator.setDuration(1000); // miliseconds 
     imageViewObjectAnimator.start(); 
+0

obraz nie jest układany jako pożądany wynik –

3

dobrze znalazłem rozwiązanie dla tego .... usuń animator obiektów i zamiast tego użyj tego kodu

camera.save(); 

      camera.rotateX(790); 
      camera.rotateY(2.5f); 
      camera.rotateZ(140); 

      camera.translate(170,0, -8); 

      camera.getMatrix(matrix); 
      camera.restore(); 

utwórz niestandardową klasę obrazu i użyj jej w applyTransformation()