Canvas学习笔记

前言

最近看书看到canvas,加上遇到工模下的两点测试,遂仿照写一个,顺便学习一下canvas。

一、简单介绍要做成的样子

1.canvas 画一个点
2.手指点击屏幕的时,点就显示在手指点击的地方,暂时不处理多个手指的情况。

二、进入正题

1.canvas画圆,这个比较简单:
Paint paint = new Paint();
   paint.setColor(Color.GREEN);
   paint.setStrokeWidth(3);
canvas.drawCircle(x1, y1, 60, paint);
2.新建一个class,继承view,重写他的onDraw()方法,代码如下:
public class DrawView extends View {

    float  x1,y1;
    boolean flag;
    public DrawView(Context context,AttributeSet attributeset) {
        super(context,attributeset);
        x1=100;
        y1=100;
    }
    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        Paint paint = new Paint();
        paint.setColor(Color.GREEN);
        paint.setStrokeWidth(3);
        paint.setTextSize(50);
        canvas.drawCircle(x1, y1, 60, paint);
    }
    public void setY1(float y) { y1 = y;}
    public void setX1(float x) { x1 = x;}
}
    这段代码基本上都很好理解,在onDraw()中画一个圆心坐标为(100,100)半径为60的圆,
这里attributeset这个属性暂时还不是特别清楚,暂时留下来,周末解决这个case
3.重写onTouchEvent事件方法。
首先贴一下xml布局:
<com.example.faker.mydraw.DrawView
     android:id="@+id/dv_circle"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     />
MainActivity 中的代码
public class MainActivity extends Activity {
    float  x1,y1;
    private DrawView drawView ;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        drawView = (DrawView) findViewById(R.id.dv_circle);
    }
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        x1 = event.getX(0);
        y1 = event.getY(0);
        drawView.setX1(x1);
        drawView.setY1(y1);
        drawView.invalidate();
        return super.onTouchEvent(event);
    }
}
    在这里我们重点关注onTouchEvent方法,首先得到屏幕上第一个触摸点的坐标,
将这个设置为圆心,drawView.invalidate();这个方法一定要调用,
如果不调用你会发现点不会随着手指移动。
这个方法源码的注释为:
     * Invalidate the whole view. If the view is visible,
     * {@link #onDraw(android.graphics.Canvas)} will be called at some point in
     * the future.
     * <p>
     * This must be called from a UI thread. To call from a non-UI thread, call
     * {@link #postInvalidate()}.
当view调用这个方法,并且这个view是visible时,那么这个方法就会使view无效。并且onDraw()方法
会重新调用。
最后加上一个canvas很好的博客

Android利用canvas画各种图形

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值