想在一张图片上进行图画操作我想应该需要一个自定义view来实现这个画图的操作
复制代码
接下来我的思路就是将这个自定义view和图片在一个FrameLayout里,就是将这个自定义view蒙在一张图片上.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129public 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的ondrow方法就可以啦····
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18<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>
然后想保存这张图画后的图片我的方法是吧这个framelayout保存成一个图片然后放在sdcard里。显得好笨····
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35framelayout.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(); }
最后
以上就是标致胡萝卜最近收集整理的关于一种在一张图片上涂改的效果的全部内容,更多相关一种在一张图片上涂改内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复