自定义View-invalidate和postInvalidate
2017-03-22 17:00
120 查看
invalidate()方法重绘组件
不带参数:重绘指定的区域
如果要刷新组件或者让画面动起来,我们只需调用 invalidate () 方法即可。通过改变数据来影响绘制结果,这是实现组件刷新或实现动画的基本思路。
invalidate()方法只能在UI线程中调用,如果是在子线程中刷新组件,View类还定义了另一组名为postInvalidate的方法:
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:
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;
}
}
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;
}
}
相关文章推荐
- Android中自定义View的invalidate,Handler和postInvalidate
- 详解Android中自定义View的invalidate,Handler和postInvalidate
- 自定义View重绘使requestLayout, invalidate和postInvalidate的异同
- Android自定义View-invalidate()
- Android学习自定义View(二)——View和ViewGroup绘制流程以及invalidate()
- View中的 postInvalidate 和 invalidate 的区别
- 自定义View执行invalidate()方法,为什么有时候不会回调onDraw()
- Android View 深度分析requestLayout、invalidate与postInvalidate
- android自定义View (五)view.requestLayout() 与 invalidate()
- 自定义View执行invalidate()方法
- android中Invalidate和postInvalidate的更新view区别
- 从源码上深度剖析View invalidate 、 postInvalidate、requestLayout
- View的两种更新方法-从源码角度分析invalidate()和postInvalidate()的区别
- Android学习自定义View(二)——View和ViewGroup绘制流程以及invalidate()
- 自定义View时遇到的invalidate 和 postInvalidate的区别
- Android View 绘制流程 与invalidate 和postInvalidate 分析--从源码角度
- Android View刷新原理Invalidate()和PostInvalidate()源码分析
- Android之界面刷新 View更新 Invalidate和postInvalidate的区别
- android中Invalidate和postInvalidate的区别Android中实现view的更新有两组方法,一组是invalidate,另一组是postInvalidate,其中前者是在UI