Android之在Bitmap上涂鸦效果

布局文件:

<?xml version="1.0" encoding="utf-8"?>  
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
    android:layout_width="fill_parent"  
    android:layout_height="fill_parent"  
    android:orientation="vertical" >  
  
    <LinearLayout  
        android:id="@+id/handwriteview"  
        android:layout_width="wrap_content"  
        android:layout_height="wrap_content" />  
  
    <LinearLayout  
        android:layout_width="fill_parent"  
        android:layout_height="fill_parent"  
        android:orientation="horizontal"  
        android:gravity="center_horizontal" >  
  
        <Button  
            android:id="@+id/clear"  
            android:layout_width="200dp"  
            android:layout_height="wrap_content"  
            android:text="清屏" />  
          
          
    </LinearLayout>  
</LinearLayout> 


重写的View文件:

public class HandWrite extends View  
{  
    private Paint paint = null;  
    private Bitmap originalBitmap = null;  
    private Bitmap new1Bitmap = null;  
    private Bitmap new2Bitmap = null;  
    private float clickX = 0,clickY = 0;  
    private float startX = 0,startY = 0;  
    private boolean isMove = true;  
    private boolean isClear = false;  
    private int color = Color.GREEN;  
    private float strokeWidth = 2.0f;  
      
    public HandWrite(Context context,Bitmap b)  
    {  
        super(context);  
        originalBitmap = Bitmap.createBitmap(b).copy(Bitmap.Config.ARGB_8888, true); 
        new1Bitmap = Bitmap.createBitmap(originalBitmap);  
    }  
    
    public void clear(){  
        isClear = true;  
        new2Bitmap = Bitmap.createBitmap(originalBitmap);  
        invalidate();  
    }  
    public void setstyle(float strokeWidth){  
        this.strokeWidth = strokeWidth;  
    }  
    @Override  
    protected void onDraw(Canvas canvas)  
    {  
        super.onDraw(canvas);  
        canvas.drawBitmap(HandWriting(new1Bitmap), 0, 0,null);  
          
    }  
  
    public Bitmap HandWriting(Bitmap originalBitmap)  
    {  
        Canvas canvas = null;  
          
        if(isClear){  
            canvas = new Canvas(new2Bitmap);  
        }  
        else{  
            canvas = new Canvas(originalBitmap);  
        }  
        paint = new Paint();  
        paint.setStyle(Style.STROKE);  
        paint.setAntiAlias(true);  
        paint.setColor(color);  
        paint.setStrokeWidth(strokeWidth);  
        if(isMove){  
            canvas.drawLine(startX, startY, clickX, clickY, paint);  
        }  
          
        startX = clickX;  
        startY = clickY;  
          
        if(isClear){  
            return new2Bitmap;  
        }  
        return originalBitmap;  
    }  
  
    @Override  
    public boolean onTouchEvent(MotionEvent event)  
    {  
        clickX = event.getX();  
        clickY = event.getY();  
        if(event.getAction() == MotionEvent.ACTION_DOWN){  
              
            isMove = false;  
            invalidate();  
            return true;  
        }  
        else if(event.getAction() == MotionEvent.ACTION_MOVE){  
              
            isMove = true;  
            invalidate();  
            return true;  
        }  
          
        return super.onTouchEvent(event);  
    }  
     
}  


Activity文件:

public class HandWritingActivity extends Activity  
{  
    /** Called when the activity is first created. */  
    private LinearLayout handWrite = null;  
    private Button clear = null;  
    
    int requestWidth=116;
    int requestHeight=173;
    int inSampleSize;
    @Override  
    public void onCreate(Bundle savedInstanceState)  
    {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.activity_hand_writing);  
          
        handWrite = (LinearLayout)findViewById(R.id.handwriteview);  
        clear = (Button)findViewById(R.id.clear);  
        clear.setOnClickListener(new clearListener());  
    }  
       
      
    private class clearListener implements OnClickListener{  
  
        public void onClick(View v)  
        {  
//            handWrite.clear(); 
            BitmapFactory.Options opts = new Options();
            opts.inJustDecodeBounds = true;// 让 bimapfactory假的解析这个位图,只获取位图的边框信息
            BitmapFactory.decodeResource(getResources(), R.drawable.cool, opts);
            if (opts.outHeight > requestHeight || opts.outWidth > requestWidth) {
                if (opts.outWidth > opts.outHeight) {
                    inSampleSize = Math.round((float) opts.outHeight
                            / (float) requestHeight);
                } else {
                    inSampleSize = Math.round((float) opts.outWidth
                            / (float) requestWidth);
                }
            }

             System.out.println("宽度:" + opts.outWidth);
             System.out.println("高度:" + opts.outHeight);
            opts.inSampleSize = inSampleSize;
            System.out.println(inSampleSize);

            opts.inJustDecodeBounds = false;// 由于已经得到了缩放比例 ,让位图工厂真正的解析这个位图
            // 由于前面 我们已经解析了这个输入流, 需要重新初始化这个输入流
            Bitmap b = BitmapFactory.decodeResource(getResources(), R.drawable.cool, opts);
            
            
            
            
            HandWrite hw = new HandWrite(HandWritingActivity.this, b);
            System.out.println(b.getWidth());
            handWrite.addView(hw);
            
        }  
    }  
}  
 
整合的一个涂鸦工具类:
/**
 * 使用方法:
 * 1. 创建TuYaView类实例
 * 2. 调用drawTuya方法
 * 3. 参数1:context
 * 4. 参数2:图像的byte[]字节数组
 * 5. ImageView实例
 * 6. 画笔定义
 * **/

import com.ziipin.lhdc.utils.ToastUtil;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.BitmapFactory.Options;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.widget.ImageView;

public class TuYaView {
    // 原始图片
    private Bitmap mOrignBitmap;
    private Bitmap mEditBitmap;
    private int inSampleSize;
    private int requestWidth = 500;
    private int requestHeight = 700;
    /** 编辑图片的画布 */
    private Canvas mCanvas;
    private ImageView image;
    private Paint mPaint;

    public Bitmap drawTuya(Context context, byte[] _data, ImageView image,
            Paint mPaint) {
        this.image = image;
        this.mPaint = mPaint;
        mOrignBitmap = BitmapFactory.decodeByteArray(_data, 0, _data.length);
        return showEditBitmap(context, _data, image);
    }

    /**
     * 显示编辑的图片
     */
    private Bitmap showEditBitmap(Context context, byte[] _data, ImageView image) {
        mOrignBitmap = getScaleBitmap(_data, image);
        if (mOrignBitmap == null) {
            ToastUtil.show(context, "编辑出错");
        }

        mEditBitmap = mOrignBitmap.copy(mOrignBitmap.getConfig(), true);

        mCanvas = new Canvas(mEditBitmap);
        mCanvas.drawBitmap(mOrignBitmap, new Matrix(), new Paint());
        image.setImageBitmap(mEditBitmap);
        image.setOnTouchListener(mTouchListener);
        return mEditBitmap;
    }

    /**
     * 获取结果缩放放后的图片
     * 
     * @return
     */
    private Bitmap getScaleBitmap(byte[] _data, ImageView image) {

        BitmapFactory.Options opts = new Options();
        opts.inJustDecodeBounds = true;// 让 bimapfactory假的解析这个位图,只获取位图的边框信息
        BitmapFactory.decodeByteArray(_data, 0, _data.length, opts);

        if (opts.outHeight > requestHeight || opts.outWidth > requestWidth) {
            if (opts.outWidth > opts.outHeight) {
                inSampleSize = Math.round((float) opts.outHeight
                        / (float) requestHeight);
            } else {
                inSampleSize = Math.round((float) opts.outWidth
                        / (float) requestWidth);
            }
        }

        opts.inSampleSize = inSampleSize;
        opts.inJustDecodeBounds = false;// 由于已经得到了缩放比例 ,让位图工厂真正的解析这个位图
        // 由于前面 我们已经解析了这个输入流, 需要重新初始化这个输入流
        Bitmap bmp = BitmapFactory
                .decodeByteArray(_data, 0, _data.length, opts);
        return bmp;

    }

    // touch事件
    private OnTouchListener mTouchListener = new OnTouchListener() {
        int startx = 0;
        int starty = 0;

        @Override
        public boolean onTouch(View v, MotionEvent event) {

            switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:// 手指第一次触摸屏幕
                startx = (int) event.getX();
                starty = (int) event.getY();

                break;
            case MotionEvent.ACTION_MOVE: // 手指在imageview上中移动
                int x = (int) event.getX();
                int y = (int) event.getY();
                mCanvas.drawLine(startx, starty, x, y, mPaint);
                startx = (int) event.getX();
                starty = (int) event.getY();
                image.invalidate();
                break;
            }
            return true;
        }
    };
}
原文地址:https://www.cnblogs.com/lee0oo0/p/2976584.html