布局文件:

<?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;        }    };}

更多相关文章

  1. Android 的网络编程(17)-android显示网络图片
  2. androidSDK下的图片资源
  3. 自定义RadioButton 文字在下,图片在上
  4. 自定义progressbar使用图片
  5. Shape实现圆形图片
  6. Android 异步加载图片
  7. android手机中图片的拖拉及浏览功能
  8. Android studio图片ERROR: 9-patch image xx .9.png malformed
  9. Android 之 ImageSwitch图片转换器

随机推荐

  1. eclipse上调试android里的程序。
  2. Android的Notification的简介-android学
  3. Android开发性能优化大总结
  4. Android NDK工程创建与编译运行
  5. Android左右连接和USING
  6. htc g11 hboot 2.02.0000 unlock (androi
  7. android中TextAppearanceSpan的使用
  8. 沈大海移动开发课程android,j2me
  9. Android ListView 一些设置 , 去除边缘阴
  10. Android中的GridView详解