Canvas实现简单画画板
来源:互联网 发布:法兰西斯坦知乎 编辑:程序博客网 时间:2024/05/01 07:59
原理:看似是随手指动的点,其实还是利用Canvas.drawLine(...),就是无限多的小直线可以看成连续的曲线。
摘自博客:http://www.cnblogs.com/plokmju/p/android_canvas.html#commentform
『
需要指出的是,如果程序每次都只是从上次移动事件的发生点绘制一条直线到本次拖动事件的发生点,那么当用户手指一旦离开触摸屏,再次引发触摸移动事件的时候,会导致前面绘制的内容被丢失。为了保留用户之前绘制的内容,程序需要借助于一个"双缓冲"的机制。
之前讲解SurfaceView的时候,有讲到SurfaceView会自己维护一个双缓冲的缓冲区,但是在这里使用ImageView来展示绘图效果,它需要我们去维护双缓冲的机制。当用户在ImageView上进行"绘制"的时候,程序并不直接"绘制"到该ImageView组件上,而是先绘制到一个内存中的Bitmap对象(缓冲)上,等到内存中的Bitmap绘制好之后,再一次性的将Bitmap对象"绘制"到ImageView上。
』
贴代码一: layout_main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context=".MainActivity" > <Button android:id="@+id/btn_resume" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="重新画图" /> <ImageView android:id="@+id/imgView" android:layout_width="match_parent" android:layout_height="match_parent" /></LinearLayout>贴代码二: mainActivity.java
public class MainActivity extends Activity {private Button btn_resume;private ImageView imgView;private Bitmap baseBitmap;private Canvas canvas;private Paint paint;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);paint =new Paint();paint.setStrokeWidth(10);paint.setColor(Color.CYAN);imgView=(ImageView)findViewById(R.id.imgView);imgView.setOnTouchListener(touch);btn_resume=(Button)findViewById(R.id.btn_resume);btn_resume.setOnClickListener(new OnClickListener(){@Overridepublic void onClick(View v) {if(baseBitmap!=null){baseBitmap=Bitmap.createBitmap(imgView.getWidth(),imgView.getHeight(),Bitmap.Config.ARGB_8888);canvas=new Canvas(baseBitmap);canvas.drawColor(Color.WHITE);imgView.setImageBitmap(baseBitmap);}}});} View.OnTouchListener touch= new OnTouchListener(){float startX;float startY;@Overridepublic boolean onTouch(android.view.View v, MotionEvent event) { switch(event.getAction()){ case MotionEvent.ACTION_DOWN: if(baseBitmap==null){ baseBitmap =Bitmap.createBitmap(imgView.getWidth(), imgView.getHeight(), Bitmap.Config.ARGB_8888); //生成一个空白的位图Bitmap canvas=new Canvas(baseBitmap); //创建一个以baseBitmap为背景的Canvas canvas.drawColor(Color.WHITE); } startX=event.getX(); startY=event.getY(); break; case MotionEvent.ACTION_MOVE: float stopX=event.getX(); float stopY=event.getY(); canvas.drawLine(startX, startY, stopX, stopY, paint); startX=event.getX(); startY=event.getY(); imgView.setImageBitmap(baseBitmap); break; case MotionEvent.ACTION_UP: break; default :break; }return true;}};}
贴截图:
- Canvas实现简单画画板
- android实现简单的画画板
- Android之Canvas画画板
- Android 实现简单的画画版一
- ImageView实现画画板的功能
- 画画板
- 画画板
- 画画板
- Android 自定义控件的画画扳的简单实现
- 趣味编程-JavaScript-使用画布画画canvas
- iOS 使用UIBezierPath类实现随手画画板
- iOS 使用UIBezierPath类实现随手画画板
- iOS 使用UIBezierPath类实现随手画画板
- flash简单画画actionscript3.0
- 实现简单的Canvas画图
- js+canvas实现简单绘图
- android画画板
- 图片画画板
- Jira数据导出,Java写mpp文件
- Test-Driven Development
- Chubby:面向松耦合的分布式系统的锁服务[译]
- 身份证号的js验证
- SSIS可靠性和扩展性—错误输出
- Canvas实现简单画画板
- Tomcat 中 GET方式 请求 中文乱码 出现的原因
- hadoop MapReduce 三种连接
- JDK自带的java.util.Timer定时器的实现原理
- 渐进式地垃圾回收: 火车算法
- 你所不知道的Spotify:比盗版更便捷的音乐服务[译]
- 分享
- 使用maven-war-plugin 对Maven项目进行动态打包
- h5页面