在编写一个自定义视图时由于有一点动画,所以便想到了如果是在播放动画时是否会调用View.onDraw()方法进行更新界面呢?
刚开始我理所当然的觉得是应该需要,因为看起来这个动画的大小和位置和大小过都变了啊,既然位置变化了,肯定会调用layout和invalidate吧.所以呢我就写了下代码实践下,下面就是结果咯.
程序的xml文件,很简单,就一个
xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity">
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/view"
android:layout_centerHorizontal="true"
android:layout_above="@+id/button" />
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="playObject"
android:onClick="playObjectAnimation"
android:id="@+id/button"
android:layout_alignParentBottom="true"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true" />
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="playTween"
android:id="@+id/button2"
android:onClick="playTweenAnimation"
android:layout_alignBottom="@+id/button"
android:layout_toRightOf="@+id/button"
android:layout_alignRight="@+id/view"
android:layout_alignEnd="@+id/view" />
activity 代码
package com.test.lovely3x.whenplayanimationviewondrawiscall;
import android.animation.ObjectAnimator;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.animation.TranslateAnimation;
public class MainActivity extends ActionBarActivity {
private View view;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
this.view = findViewById(R.id.view);
}
/**
* 播放一个属性动画
*/
public void playObjectAnimation(View v){
view.clearAnimation();
ObjectAnimator animation = ObjectAnimator.ofFloat(view, View.TRANSLATION_Y, 10, 30, 40, 0);
animation.setDuration(1000);
animation.start();
}
/**
* 播放补间动画
*/
public void playTweenAnimation(View v){
view.clearAnimation();
TranslateAnimation animation = new TranslateAnimation(0,0,0,30);
animation.setDuration(1000);
view.setAnimation(animation);
animation.start();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
}
测试的自定定义视图
package com.test.lovely3x.whenplayanimationviewondrawiscall;
import android.annotation.TargetApi;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.os.Build;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;
/**
* Created by lovely3x on 2015/4/9.
* 这个View是为了测试,一个视图在进行动画操作时是否会调用onDraw() 对视图进行视图重绘
*/
public class TestView extends View{
public static final String TAG = "testview";
private Paint paint;
public TestView(Context context) {
super(context);
init();
}
public TestView(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
public TestView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
}
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
public TestView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
init();
}
private void init(){
paint = new Paint();
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
Log.e(TAG, "call draw");
canvas.drawCircle(getWidth() / 2 - 10,getHeight() / 2 - 10,10,paint);
}
}
代码就这么多,贴完了
点击playObjectAnimation方法后的日志输出
ObjectAnimation: 可以明显的看到只有一条日志输出,就是程序启动后执行了一次onDraw,但是点击播放属性动画后根本没有执行onDraw
点击playTweenAnimation方法后的日志输出
TweenAniamtion : 可以看出,还是只有一条日志语句出现在logcat中
最后我个人浅浅的总结下,就是 不会调用 被动画者的onDraw方法,但是我觉得不可能啊,因为明明视图的位置都变化了,为啥不调用onDraw呢!
夜已深,明日继续分析!