您的位置:首页 > 移动开发 > Android开发

自定义View-invalidate和postInvalidate

2017-03-22 17:00 120 查看
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);
}
}

activity_main:
<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;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息