2016-07-15 3 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()この方法で呼び出す方法は、のピボットについてはViewです。

Viewのピボットは、View.setPivotX()View.setPivotY()の方法で設定します。

コンストラクタで、これらの値を指定されたxとyに設定します。あなたのビューは、供給された中心点を基準にしてスケールされます。

+0

ありがとう、それは素晴らしい動作します! –

関連する問題