自定义View-invalidate和postInvalidate

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_32113133/article/details/64921763

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;
    }
}


猜你喜欢

转载自blog.csdn.net/qq_32113133/article/details/64921763