zoukankan      html  css  js  c++  java
  • androidAPI之FingerPaint手指绘图详解

    效果图

    不多废话,马上弄源码。

    主Activity类DemoViewPath.java

     

    1. package com.geolo.android.demoViewPath;   
    2. import android.app.Activity;   
    3. import android.os.Bundle;   
    4. public class DemoViewPath extends Activity {   
    5.     @Override  
    6.     protected void onCreate(Bundle savedInstanceState) {   
    7.         DemoPath dp = new DemoPath(this);   
    8.         setContentView(dp);   
    9.         super.onCreate(savedInstanceState);   
    10.     }   
    11. }  


    绘图类:DemoPath.java

     

    1. package com.geolo.android.demoViewPath;   
    2. import android.content.Context;   
    3. import android.graphics.Bitmap;   
    4. import android.graphics.Canvas;   
    5. import android.graphics.Paint;   
    6. import android.graphics.Path;   
    7. import android.view.MotionEvent;   
    8. import android.view.View;   
    9. public class DemoPath extends View {   
    10.     private float mX , mY;   
    11.     private Path mPath;   
    12.     private Paint mPaint;   
    13.     private static final float TOUCH_TOLERANCE = 4;   
    14.     private Bitmap  mBitmap;   
    15.     private Canvas  mCanvas;   
    16.     private Paint   mBitmapPaint;   
    17.        
    18.     public DemoPath(Context c) {   
    19.         super(c);   
    20.            
    21.         mPaint = new Paint();//创建画笔渲染对象   
    22.         mPaint.setAntiAlias(true);//设置抗锯齿,让绘画比较平滑   
    23.         mPaint.setDither(true);//设置递色   
    24.         mPaint.setColor(0xFFFF0000);//设置画笔的颜色   
    25.         mPaint.setStyle(Paint.Style.STROKE);//画笔的类型有三种(1.FILL 2.FILL_AND_STROKE 3.STROKE )   
    26.         mPaint.setStrokeJoin(Paint.Join.ROUND);//默认类型是MITER(1.BEVEL 2.MITER 3.ROUND )   
    27.         mPaint.setStrokeCap(Paint.Cap.ROUND);//默认类型是BUTT(1.BUTT 2.ROUND 3.SQUARE )  
    28.         mPaint.setStrokeWidth(12);//设置描边的宽度,如果设置的值为0那么边是一条极细的线   
    29.            
    30.         mBitmap = Bitmap.createBitmap(320480, Bitmap.Config.ARGB_8888);//绘制固定大小的bitmap对象   
    31.         mCanvas = new Canvas(mBitmap);//将固定的bitmap对象嵌入到canvas对象中   
    32.         mPath = new Path();//创建画笔路径   
    33.         mBitmapPaint = new Paint(Paint.DITHER_FLAG);   
    34.     }   
    35.     @Override  
    36.     protected void onDraw(Canvas canvas) {   
    37.         canvas.drawColor(0xFFAAAAAA);   
    38.         canvas.drawBitmap(mBitmap, 00, mBitmapPaint);   
    39.         canvas.drawPath(mPath, mPaint);   
    40.         super.onDraw(canvas);   
    41.     }   
    42.     private void onTouchDown(float x , float y){   
    43.         mPath.reset();//将上次的路径保存起来,并重置新的路径。   
    44.         mPath.moveTo(x, y);//设置新的路径“轮廓”的开始   
    45.         mX = x;   
    46.         mY = y;   
    47.     }   
    48.     private void onTouchMove(float x , float y){   
    49.         float dx = Math.abs(x - mX);   
    50.         float dy = Math.abs(y - mY);   
    51.         if (dx >= TOUCH_TOLERANCE || dy >= TOUCH_TOLERANCE) {   
    52.             mPath.quadTo(mX, mY, (x + mX)/2, (y + mY)/2);   
    53.             mX = x;   
    54.             mY = y;   
    55.         }   
    56.     }   
    57.     private void onTouchUp(float x , float y){   
    58.         mPath.lineTo(mX, mY);//从最后一个指定的xy点绘制一条线,如果没有用moveTo方法,那么起始点表示(0,0)点。   
    59.         // commit the path to our offscreen   
    60.         mCanvas.drawPath(mPath, mPaint);//手指离开屏幕后,绘制创建的“所有”路径。   
    61.         // kill this so we don't double draw   
    62.         mPath.reset();   
    63.     }   
    64.     @Override  
    65.     public boolean onTouchEvent(MotionEvent event) {   
    66.         float x = event.getX();   
    67.         float y = event.getY();   
    68.         switch (event.getAction()) {   
    69.         case MotionEvent.ACTION_DOWN://手指开始按压屏幕,这个动作包含了初始化位置   
    70.             onTouchDown(x , y);   
    71.             invalidate();//刷新画布,重新运行onDraw()方法   
    72.             break;   
    73.         case MotionEvent.ACTION_MOVE://手指按压屏幕时,位置的改变触发,这个方法在ACTION_DOWN和ACTION_UP之间。   
    74.             onTouchMove(x , y);   
    75.             invalidate();   
    76.             break;   
    77.         case MotionEvent.ACTION_UP://手指离开屏幕,不再按压屏幕   
    78.             onTouchUp(x , y);   
    79.             invalidate();   
    80.             break;   
    81.         default:   
    82.             break;   
    83.         }   
    84.         return true;   
    85.     }   
    86. }  
  • 相关阅读:
    [Luogu 2261] CQOI2007 余数求和
    [Luogu 3178] HAOI2013 树上操作
    「模板」 树链剖分 HLD
    「模板」 线段树——区间乘 && 区间加 && 区间求和
    [Luogu 2221] HAOI2012 高速公路
    [Luogu 3973] TJOI2015 线性代数
    「模板」 01 Trie实现平衡树功能
    [Luogu 1640] SCOI2010 连续攻击游戏
    [Luogu 1402] 酒店之王
    [Luogu 1963] NOI2009 变换序列
  • 原文地址:https://www.cnblogs.com/daichangya/p/12959907.html
Copyright © 2011-2022 走看看