一种在一张图片上涂改的效果

来源:互联网 发布:深圳软件开发定制 编辑:程序博客网 时间:2024/06/11 17:14

想在一张图片上进行图画操作我想应该需要一个自定义view来实现这个画图的操作

public class PaintView extends View{Paint paint;float mX,mY;Path path;private static final float TOUCH_TOLERANCE=4;Bitmap bitmap;Canvas mcanvas;Paint bitmapPaint;List<Drawpath> savepathlist;//用来保存路径Drawpath dp;int bitmapwidth;int bitmaphight;public PaintView(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);}public PaintView(Context context, AttributeSet attrs) {super(context, attrs);DisplayMetrics dm=new DisplayMetrics();//获得((Activity)context).getWindowManager().getDefaultDisplay().getMetrics(dm);bitmapwidth= dm.widthPixels;bitmaphight=dm.heightPixels-2*45;savepathlist=new ArrayList<Drawpath>();initCanvas();}private void initCanvas() {paint =new Paint(Paint.ANTI_ALIAS_FLAG);//设置画笔抗锯齿paint.setDither(true);paint.setColor(Color.RED);//设置画笔颜色paint.setStyle(Paint.Style.STROKE);paint.setStrokeJoin(Paint.Join.ROUND);//?paint.setStrokeCap(Paint.Cap.ROUND);//?paint.setStrokeWidth(5);//设置描边宽度bitmap=Bitmap.createBitmap(bitmapwidth,bitmaphight, Config.ARGB_8888);//先给Bitmap一个默认值1,方便以下变量初始化mcanvas=new Canvas(bitmap);mcanvas.drawColor(0x00FFFFFF);path=new Path();//创建画笔路径?bitmapPaint=new Paint(Paint.DITHER_FLAG);//?}public PaintView(Context context) {super(context);}@Overrideprotected void onDraw(Canvas canvas ) {super.onDraw(canvas);canvas.drawColor(0x00FFFFFF);canvas.drawBitmap(bitmap, 0, 0, bitmapPaint);     //显示旧的画布       if (path != null) {// 实时的显示canvas.drawPath(path, paint);}}class Drawpath{Paint dpaint;Path dpath;}public void doback(){if(savepathlist != null && savepathlist.size() > 0){//调用初始化画布函数以清空画布initCanvas();//将路径保存列表中的最后一个元素删除 ,并将其保存在路径删除列表中Drawpath drawPath = savepathlist.get(savepathlist.size() - 1);savepathlist.remove(savepathlist.size() - 1);//将路径保存列表中的路径重绘在画布上Iterator<Drawpath> iter = savepathlist.iterator();      //重复保存while (iter.hasNext()) {Drawpath dp = iter.next();mcanvas.drawPath(dp.dpath, dp.dpaint);}invalidate();// 刷新}}public void clearbitmap(){//调用初始化画布函数以清空画布initCanvas();invalidate();//刷新savepathlist.clear();}private void onTouchDown(float x,float y){path.reset();//重新设置路径path.moveTo(x, y);mX=x;mY=y;}private void onTouchMove(float x,float y){float dx=Math.abs(x-mX);float dy=Math.abs(y-mY);if(dx>=TOUCH_TOLERANCE||dy>=TOUCH_TOLERANCE){path.quadTo(mX, mY, (x+mX)/2, (y+mY)/2);mX=x;mY=y;}}private void onTouchUp(){path.lineTo(mX, mY);//从最后一个指定的xy点绘制一条线,如果没有用moveTo方法,那么起始点0,0点mcanvas.drawPath(path, paint);//设置手指离开时的路径savepathlist.add(dp);Log.i("TAG","-----------size:--------"+savepathlist.size());path=null;} @Overridepublic boolean onTouchEvent(MotionEvent event) {float x=event.getX();float y=event.getY();switch (event.getAction()) {case MotionEvent.ACTION_DOWN:path=new Path();dp=new Drawpath();dp.dpaint=paint;dp.dpath=path;onTouchDown(x, y);invalidate();//刷新画布,重新运行ondraw;break;case MotionEvent.ACTION_MOVE:onTouchMove(x, y);invalidate();break;case MotionEvent.ACTION_UP:onTouchUp();invalidate();break;default:break;}return true;}}
接下来我的思路就是将这个自定义view和图片在一个FrameLayout里,就是将这个自定义view蒙在一张图片上.

 <FrameLayout        android:id="@+id/fralyt_pictureActivity"        android:layout_width="match_parent"        android:layout_height="0dp"        android:layout_weight="1"         >        <ImageView            android:id="@+id/iv_pictureActivity"            android:layout_width="match_parent"            android:layout_height="match_parent"            android:scaleType="fitXY"            android:src="@drawable/pic_default" />        <cn.com.PaintView            android:id="@+id/paintview_pictureActivity"            android:layout_width="match_parent"            android:layout_height="match_parent"            />    </FrameLayout>
接下来就可以才画啦。。。画的时候调用自定view的ondrow方法就可以啦····

然后想保存这张图画后的图片我的方法是吧这个framelayout保存成一个图片然后放在sdcard里。显得好笨····

framelayout.setDrawingCacheEnabled(true);framelayout.layout (0, 0, framelayout.getWidth(), framelayout.getHeight());    final Bitmap bp = framelayout.getDrawingCache();//获得可视组件的截图final String path = Constants.ROOT_PATH+Constants.EditPictureDir;/*//转换成2进制流ByteArrayOutputStream baos=new ByteArrayOutputStream();  bp.compress(Bitmap.CompressFormat.PNG, 100, baos);  byte [] bitmapByte =baos.toByteArray();  *//** * 起线程写入文件 */myDialog= ProgressDialog.show(PictureEditActivity.this, "正在保存..", "请稍后..", true, true);new Thread(){public void run() {try {//Bitmap bitmap=ImageUtil.comp(bp);File dir = new File(path);if (!dir.exists()) {dir.mkdirs();}File file = new File(dir, "raw_"+new SimpleDateFormat("yyyyMMddHHmmss").format(new Date())+".png");FileOutputStream out = new FileOutputStream(file);bp.compress(CompressFormat.PNG,100, out);out.flush();out.close();String filepath=file.getAbsolutePath();Message.obtain(handler, 105, filepath).sendToTarget();}catch (Exception e) {e.printStackTrace();}};}.start();}



0 0
原创粉丝点击