zoukankan      html  css  js  c++  java
  • 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;
            }
        };
    }
  • 相关阅读:
    【Python】多态、协议和鸭子类型
    【Python】魔法方法之__call__,将对象当方法使用
    【Python】策略模式
    【Python】if 后怎么就可以跟对象?变量交换写法是语法糖吗?
    【Python 库】NumPy 超详细教程(3):ndarray 的内部机理及高级迭代
    【Python 库】NumPy 超详细教程(2):数据类型
    【Python 库】NumPy 超详细教程(1):NumPy 数组
    【杂谈】10 年三线小城 IT 开发的感悟
    【PostgreSQL】安装及中文显示
    【Python 库】轻量级 ORM 框架 peewee 用法详解之——增删改查
  • 原文地址:https://www.cnblogs.com/lee0oo0/p/2976584.html
Copyright © 2011-2022 走看看