2016-07-15 77 views
0

我有一個自定義視圖,我想要相對於中心進行縮放。自定義視圖的縮放動畫(相對於中心點)

如果我使用這行代碼爲它工作得很好,正確縮放的ImageView:

imageView.animate().scaleX(2.5f).scaleY(2.5f).setDuration(2000); 

但是,如果我用它爲我的自定義視圖,它的上升,和動畫不能正常看,如何解決它?

這裏是一個視頻:https://youtu.be/f0-jMqE9ULU
(紅色圓圈的動畫腳麻,粉紅色的圓圈(ImageView的動畫)正常工作)

我的自定義視圖:

public class CircleDrawView extends View { 
    private Paint paint; 
    private int x; 
    private int y; 
    private String labelName; 
    private int radius = 40; 

    public CircleDrawView(Context context, AttributeSet attrs) 
    { 
     super(context, attrs); 
    } 

    public CircleDrawView(Context context) 
    { 
     super(context); 
     paint = new Paint(); 
    } 

    public CircleDrawView(Context context, int x, int y, String labelName) 
    { 
     super(context); 
     paint = new Paint(); 
     this.x=x; 
     this.y=y; 
     this.labelName=labelName; 
    } 


    @Override 
    protected void onDraw(Canvas canvas) 
    { 
     super.onDraw(canvas); 
     paint.setColor(Color.RED); 
     canvas.drawCircle(x, y, radius, paint); 
     Paint textPaint = new Paint(); 
     textPaint.setTextSize(25); 
     textPaint.setColor(Color.WHITE); 
     textPaint.setAntiAlias(true); 
     textPaint.setTextAlign(Paint.Align.CENTER); 
     Rect bounds = new Rect(); 
     textPaint.getTextBounds(labelName, 0, labelName.length(), bounds); 
     canvas.drawText(labelName, x, y, textPaint); 

    } 
} 

活動:

public class MainActivity extends AppCompatActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     LinearLayout rootView =(LinearLayout) findViewById(R.id.test_layout); 
     ImageView imageView = (ImageView) findViewById(R.id.test_image); 

     CircleDrawView circle = new CircleDrawView(getApplicationContext(), 200, 200, "1"); 
     rootView.addView(circle); 
     rootView.invalidate(); 
     circle.animate().scaleX(1.2f).scaleY(1.2f).setDuration(2000); 
     imageView.animate().scaleX(2.5f).scaleY(2.5f).setDuration(2000); 
} 
} 

XML:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:paddingBottom="@dimen/activity_vertical_margin" 
    android:paddingLeft="@dimen/activity_horizontal_margin" 
    android:paddingRight="@dimen/activity_horizontal_margin" 
    android:paddingTop="@dimen/activity_vertical_margin" 

    tools:context="com.example.attracti.animation.MainActivity"> 

    <LinearLayout 
     android:id="@+id/test_layout" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:orientation="horizontal"> 

     <ImageView 
      android:id="@+id/test_image" 
      android:layout_width="40dp" 
      android:layout_height="40dp" 
      android:layout_gravity="center_vertical" 
      android:layout_marginLeft="100dp" 
      android:background="@drawable/circle_shape" /> 

    </LinearLayout> 

</RelativeLayout> 

回答

1

您致電circle.animate()返回ViewPropertyAnimator。 和scaleY()您在ViewPropertyAnimator上調用的方法會根據關鍵值縮放View

View的主軸由View.setPivotX()View.setPivotY()方法設定。

在您的構造函數中,將這些值設置爲提供的x和y。然後,您的視圖將按照提供的中心點進行縮放。

+0

謝謝,它很好用! –