2016-07-23 17 views
11

Ich versuche ein Bild zu drehen, so dass es richtig unter einem anderen Bild passt. So ist es das, was ich zu erreichen versuchen:Drehen Sie ein ImageView im Uhrzeigersinn mit ObjectAnimator

What I am trying to achieve

Und das ist, was ich in der Lage bin zu erreichen:

Currently achieved

Es besteht im Wesentlichen enthält zwei ImageView mit dem ersten dem Teil enthält, über dem Boden und der zweite mit den Fliesen um den Boden zu decken.

Mein Problem ist, dass ich das Bild der Fliesen im Uhrzeigersinn nicht animieren kann und die Ansicht um die x-Achse so drehen kann, dass sie unterhalb des Bildes mit dem Teil über dem Boden liegt.

Ich verwende ObjectAnimator, um meine ImageView zu animieren. Unten ist mein Code:

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; 
} 
} 

Und unten ist mein fliping.xml für die Animation verwendet:

<?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

Erhalten Sie einen Fehler? Rotiert es überhaupt oder passiert nichts? –

+0

bitte ich bekomme Sie nicht, sorry könnten Sie mehr mehr – Elltz

+0

siehe Unterschied in den Bildern .... der erste ist gewünscht und der zweite ist Ausgabe ... Er braucht Ausgabe als erstes Bild –

Antwort

0

Try Code unten nach einfach das Bild Laden

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

Kein Bild wird nicht wie gewünscht ausgegeben –

3

gut ich gefunden habe, eine Lösung hierfür .... entfernen Objekt Animator und verwenden Sie stattdessen diesen Code

camera.save(); 

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

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

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

Erstellen Sie Ihre benutzerdefinierte Bildklasse und verwenden Sie diese in applyTransformation()