如何实现自动画线条--涂鸦

本文介绍了一种使用触摸屏获取坐标点作为画线起点,并结合重力感应功能自动绘制线条的方法,详细解释了源码实现过程。

如何实现自动画线条

本帖最后由 mikywqw 于 2013-7-22 10:37 编辑 

涂鸦源码
public class TuyaView extends View {
      private Bitmap mBitmap;
      private Canvas mCanvas;
      private Path mPath;
      private Paint mBitmapPaint;// 画布的画笔
      private Paint mPaint;// 真实的画笔
      private float mX = 0, mY = 0;// 临时点坐标
      private static final float TOUCH_TOLERANCE = 4;//宽度
      // 保存Path路径的集合,用List集合来模拟栈
      private static List<DrawPath> savePath;
      // 记录Path路径的对象
      private DrawPath dp;
      private int screenWidth, screenHeight;// 屏幕長寬
      private class DrawPath {
                public Path path;// 路径
                public Paint paint;// 画笔
      }

      public TuyaView(Context context, int w, int h) {
                super(context);
                screenWidth = w;
                screenHeight = h;
                mBitmap = Bitmap.createBitmap(screenWidth, screenHeight, Bitmap.Config.ARGB_8888);
                // 保存一次一次绘制出来的图形
                mCanvas = new Canvas(mBitmap);
                mBitmapPaint = new Paint(Paint.DITHER_FLAG);
                mPaint = new Paint();
                mPaint.setAntiAlias(true);//抗锯齿
                mPaint.setStyle(Paint.Style.STROKE);
                mPaint.setStrokeJoin(Paint.Join.ROUND);// 设置外边缘
                mPaint.setStrokeCap(Paint.Cap.ROUND);// 形状圆形
                mPaint.setStrokeWidth(50);// 画笔宽度
                savePath = new ArrayList<DrawPath>();
      }

      @Override
      public void onDraw(Canvas canvas) {
                canvas.drawColor(0xFFAAAAAA);
                // 将前面已经画过得显示出来
                canvas.drawBitmap(mBitmap, 0, 0, mBitmapPaint);
                if (mPath != null) {
                        // 实时的显示
                        canvas.drawPath(mPath, mPaint);
                }
      }

      public void touch_start(float x, float y) {
                mPath.moveTo(x, y);
                mX = x;
                mY = y;
      }

      public void touch_move(float x, float y) {
                float dx = Math.abs(x - mX);
                float dy = Math.abs(mY - y);
                if (dx >= TOUCH_TOLERANCE || dy >= TOUCH_TOLERANCE) {
                        // 从x1,y1到x2,y2画一条贝塞尔曲线,更平滑(直接用mPath.lineTo也是可以的)
                        mPath.quadTo(mX, mY, (x + mX) / 2, (y + mY) / 2);
                        mX = x;
                        mY = y;
                }
      }

      public void touch_up() {
                mPath.lineTo(mX, mY);
                mCanvas.drawPath(mPath, mPaint);
                //将一条完整的路径保存下来(相当于入栈操作)
                savePath.add(dp);
                mPath = null;// 重新置空
      }

      @Override
      public boolean onTouchEvent(MotionEvent event) {
                float x = event.getX();
                float y = event.getY();
                switch (event.getAction()) {
                case MotionEvent.ACTION_DOWN:
                        // 每次down下去重新new一个Path
                        mPath = new Path();
                        //每一次记录的路径对象是不一样的
                        dp = new DrawPath();
                        dp.path = mPath;
                        dp.paint = mPaint;
                        touch_start(x, y);
                        invalidate();
                        break;
                case MotionEvent.ACTION_MOVE:
                        touch_move(x, y);
                        invalidate();
                        break;
                case MotionEvent.ACTION_UP:
                        touch_up();
                        invalidate();
                        break;
                }
                return true;
      }
这个是涂鸦的源码,我想知道如何通过点击屏幕获取坐标点作为画线的起始点,然后通过重力感应功能,自动画出线条来,而不是通过上面代码的MotionEvent.ACTION_MOVE来画
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值