本文实例讲述了Android编程实现在Bitmap上涂鸦效果。分享给大家供大家参考,具体如下:
布局文件:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
<? 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文件:
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
|
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文件:
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
|
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
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
|
/** * 使用方法: * 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 ; } }; } |
希望本文所述对大家Android程序设计有所帮助。