invalidate()方法重绘组件
public void invalidate()
public void invalidate(int l,int t,int r,int b)
public void invalidate(Rect dirty)
带参数:重绘整个视图区域
不带参数:重绘指定的区域
如果要刷新组件或者让画面动起来,我们只需调用 invalidate () 方法即可。通过改变数据来影响绘制结果,这是实现组件刷新或实现动画的基本思路。
invalidate()方法只能在UI线程中调用,如果是在子线程中刷新组件,View类还定义了另一组名为postInvalidate的方法:
public void postInvalidate()
public void postInvalidate(int left,int top,int right,int bottom)
MainActivity:
public class MainActivity extends Activity {
private BallMoveView ballview;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ballview = (BallMoveView) findViewById(R.id.ballview);
Timer timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
ballview.postInvalidate();//在子线程中执行 postInvalidate()会使onDrow()方法得到执行
}
}, 300, 50);
}
}
<com.example.user.myapplication.BallMoveView
android:id="@+id/ballview"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</RelativeLayout>
BallMoveView:
public class BallMoveView extends View {
private float cicleX;//小球的x坐标
private static final float CICLEY = 100;//小球的y坐标 固定为100
private static final float RADIUS = 30;//小球的圆心
private boolean direction;//小球的移动方向
private Paint paint;
public BallMoveView(Context context) {
this(context,null);
}
public BallMoveView(Context context, AttributeSet attrs) {
this(context, attrs,0);
}
public BallMoveView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
}
public void init(){
paint = new Paint();//实例化画笔
paint.setAntiAlias(true);//去除毛边
paint.setColor(Color.parseColor("#00a0e9"));//设置画笔为蓝色
paint.setStyle(Paint.Style.FILL_AND_STROKE);//设置为描边并且实心
cicleX = RADIUS;//设置小球在组件的左边缘
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.drawCircle(cicleX,CICLEY,RADIUS,paint);//画一个小球
if(cicleX <= RADIUS){
direction = true;
}
int width = getMeasuredWidth();
if(cicleX >= width-RADIUS){
direction = false;
}
cicleX = direction ? cicleX+5 : cicleX-5;
}
}