自定义View动画(基础+圆形变动)

//自定义View

public class MyView extends View{
    int width=00;
    int height=00;
    int speedX=50;
    int speddY=20;
    int x=100;
    int y=100;
    private Paint mpaint;
    public MyView(Context context) {
        super(context);
    }

    public MyView(Context context, @Nullable AttributeSet attrs) {
        this(context, attrs,0);
    }

    public MyView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        initPaint();
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        Log.e("tag", "构造器MyView的宽=="+getWidth() );

    }

    private void initPaint() {
        mpaint=new Paint();
        mpaint.setColor(Color.BLACK);
        mpaint.setStrokeWidth(10);
        mpaint.setStyle(Paint.Style.STROKE);
    }

    @Override
    protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
        super.onLayout(changed, left, top, right, bottom);
    }

    @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        super.onSizeChanged(w, h, oldw, oldh);
        width=w;
        height=h;
        Log.e("tag","onSizeChanged MyView 的宽 == " +width+"onSizeChanged MyView 的高 =="+height);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        //canvas.drawPoint(100,100,mpaint);
       // mpaint.setColor(Color.RED);
       // mpaint.setStrokeWidth(20);
        //canvas.drawLine(20,20,200,800,mpaint);
        //canvas.drawRect(20,20,200,800,mpaint);
        //RectF  rectF = new RectF(x, 100, y, 200);
        //canvas.drawRoundRect(rectF,150,150,mpaint);
        //canvas.drawCircle(getWidth()/2,getHeight()/2,150,mpaint);
        //RectF rectF = new RectF(30, 50, 70, 70);
        //canvas.drawOval(rectF,mpaint);
        //RectF rectF = new RectF(100,100,200,200);
        //canvas.drawArc(rectF,0,90,true,mpaint);
       /* Path path = new Path();
        path.moveTo(20,20);
        path.lineTo(20,80);
        //path.addRect(100,100,200,200,Path.Direction.CW);
        RectF rectF = new RectF(100, 100, 200, 200);
        path.arcTo(rectF,0,90,true);
        path.close();
        canvas.drawPath(path,mpaint);*/
       canvas.drawCircle(x,y,50,mpaint);
       try {
           Thread.sleep(1000);
       }catch (Exception e){
           e.printStackTrace();
       }
       invalidate();
    }
    //用来刷新重新执行onDraw方法
    @Override   //隐外类得特
    public void invalidate() {
        super.invalidate();
        mpaint.setColor(Color.RED);
        x+=speedX;
        y+=speddY;
        if (x<=50||x>=getWidth()){
             speedX *=-1;
        }else if (y<=0||y>=getHeight()){
            speddY *=-1;
        }

    }
   /* //和invalidate的区别是可以在子线程中刷新UI
    @Override
    public void postInvalidate() {
        mpaint.setColor(Color.RED);
        x+=30;
        y+=30;
        super.postInvalidate();
    }
    //请求重新布局
   @Override
    public void requestLayout() {
        super.requestLayout();
        mpaint.setColor(Color.RED);
    }*/
}



//MainActivity

public class MainActivity extends AppCompatActivity {

    private MyView myView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        myView = findViewById(R.id.myview);
    }
}

猜你喜欢

转载自blog.csdn.net/aa15362415/article/details/80644807