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

想在一张图片上进行图画操作我想应该需要一个自定义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);

	}
	@Override
	protected 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;
		
	} 
	@Override
	public 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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值