[Android初级]实现简单的画图板
来源:互联网 发布:剑3唐门成男捏脸数据 编辑:程序博客网 时间:2024/05/16 18:27
【注】本案例来自疯狂Android讲义,仅作为学习参考
这是一篇简单的关于android的手写板简单实现,效果是可在屏幕上绘制任意的图形。实现手绘功能其实是一种假象,表面上看起来可以随用户在触摸屏上自由的画线,实际上是利用Canvas的drawLine方法画直线,每条直线都是在上一次拖动事件发生点画到本次拖动事件发生点。借助Android的Path类,可以非常方便地实现这种效果。
这个设计思路是,当程序需要在指定View上进行绘制时,程序并不直接绘制到该View组件上,而是先绘制到一个内存中的Bitmap图片上,等到内存中的Bitmap绘制好之后,再一次性的将Bitmap绘制到View组件上。
(1)该View的代码如下。
package com.example.drawingtest.view;import android.content.Context;import android.graphics.Bitmap;import android.graphics.Bitmap.Config;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.graphics.Path;import android.util.AttributeSet;import android.view.MotionEvent;import android.view.View;public class DrawView extends View {public Paint paint;// 定义一个内存中的图片,该图片将作为缓冲区Bitmap cacheBitmap = null;// 定义cacheBitmap上的Canvas对象Canvas cacheCanvas = null;float preX;float preY;final int VIEW_WIDTH = 320;final int VIEW_HEIGHT = 480;private Path path;private boolean isReset;public DrawView(Context context, AttributeSet attrs) {super(context, attrs);// 创建一个与该View相同大小的缓冲区cacheBitmap = Bitmap.createBitmap(VIEW_WIDTH, VIEW_HEIGHT,Config.ARGB_8888);cacheCanvas = new Canvas();path = new Path();// 设置cacheCanvas将会绘制到内存中的cacheBitmap上cacheCanvas.setBitmap(cacheBitmap);// 设置画笔的颜色paint = new Paint();paint.setColor(Color.RED);// 设置画笔的风格paint.setStyle(Paint.Style.STROKE);paint.setStrokeWidth(1);// 反锯齿paint.setAntiAlias(true);paint.setDither(false);}@Overridepublic boolean onTouchEvent(MotionEvent event) {// 获取拖动事件的发生位置float x = event.getX();float y = event.getY();switch (event.getAction()) {case MotionEvent.ACTION_DOWN:path.moveTo(x, y);preX = x;preY = y;break;case MotionEvent.ACTION_MOVE:// 从触碰点作为控制点画曲线path.quadTo(preX, preY, x, y);preX = x;preY = y;break;case MotionEvent.ACTION_UP:cacheCanvas.drawPath(path, paint);path.reset();break;}invalidate();// 返回true表明处理方法已经处理该事件return true;}@Overrideprotected void onDraw(Canvas canvas) {if (isReset) {cacheBitmap = Bitmap.createBitmap(VIEW_WIDTH, VIEW_HEIGHT,Config.ARGB_8888);cacheCanvas = new Canvas();path = new Path();cacheCanvas.setBitmap(cacheBitmap);isReset = !isReset;}Paint bmpPaint = new Paint();// 将cacheBitmap绘制到该View组件上(对缓存了Bitmap的Cancas进行绘图)canvas.drawBitmap(cacheBitmap, 0, 0, bmpPaint);// 沿着path绘制canvas.drawPath(path, paint);}/** * 清理界面 */public void reset() {cacheBitmap = null;isReset = true;invalidate();}}
(2)显示界面。
package com.example.drawingtest;import com.example.drawingtest.view.DrawView;import android.app.Activity;import android.graphics.BlurMaskFilter;import android.graphics.Color;import android.graphics.EmbossMaskFilter;import android.os.Bundle;import android.view.Menu;import android.view.MenuInflater;import android.view.MenuItem;public class HandDraw extends Activity {EmbossMaskFilter emboss;BlurMaskFilter blur;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.handdraw_layout);emboss = new EmbossMaskFilter(new float[]{1.5f,1.5f,1.5f}, 0.6f, 6, 4.2f);blur = new BlurMaskFilter(8, BlurMaskFilter.Blur.NORMAL);}@Overridepublic boolean onCreateOptionsMenu(Menu menu) {MenuInflater inflater = new MenuInflater(this);inflater.inflate(R.menu.my_menu, menu);return super.onCreateOptionsMenu(menu);}@Overridepublic boolean onOptionsItemSelected(MenuItem item) {DrawView dv = (DrawView) findViewById(R.id.hand_draw_view);switch (item.getItemId()) {case R.id.red:dv.paint.setColor(Color.RED);item.setChecked(true);break;case R.id.green:dv.paint.setColor(Color.GREEN);item.setChecked(true);break;case R.id.blue:dv.paint.setColor(Color.BLUE);item.setChecked(true);break;case R.id.width_1:dv.paint.setStrokeWidth(1);break;case R.id.width_3:dv.paint.setStrokeWidth(3);break;case R.id.width_5:dv.paint.setStrokeWidth(5);break;case R.id.blur:dv.paint.setMaskFilter(blur);break;case R.id.emboss:dv.paint.setMaskFilter(emboss);break;case R.id.clear:dv.reset();break;}return true;}}(3)截图效果。
上面的程序很简单。
0 0
- [Android初级]实现简单的画图板
- 画图板的简单实现
- 画图板的简单实现
- Android入门,简单画图板的实现,自定义组件的实现
- java简单画图板的实现
- 用自定义view实现的简单画图板
- Java基础之简单画图板的实现
- 画图板简单实现
- java简单画图板实现
- 初级画图板
- 简单的画图板
- 简单画图板的创建
- wxPython实现的画图板
- 画图板铅笔的实现
- 画图板的实现
- surfaceview画图板的简单使用
- 画图板部分功能的实现
- 使用双缓冲技术实现简单画图板
- 用Java实现单链表的反转
- 创建一个不可被杀死的service
- oracle 分区详情
- c# 怎么动态修改webservice的地址和端口 动态修改配置文件
- MongoDB学习之旅二十四:MongoDB Replica Sets 增加节点
- [Android初级]实现简单的画图板
- ios7.1发布企业证书测试包的问题
- u-boot源码配置原理分析
- 宽屏透明html5产品展示模板
- mouseover事件与mouseenter事件
- 黑马程序员——交通灯管理系统学习总结
- 本文介绍在Wireshark网络协议分析仪中如果解密SSL和TLS流量
- hdu1978(记忆化搜索/DP)
- C语言基础——new/delete与malloc/free比较