Android自定义SurfaceView实现画板功能
作者:qq_25193681 发布时间:2022-01-17 06:57:19
标签:Android,SurfaceView,画板
接触了这么久的View,总不能一直停留在View里,现在开始呢,就要学习一个新的知识点:SurfaceView,实际上SurfaceView与View的原理都差不多,只是效率和渲染方式上,SurfaceView要优于View,这也是我们写这个的原因。今天就看看这个SurfaceView,好了,下面就是今天要说的效果。
界面很简单,就是一个按钮以及一个画板,先看看界面的代码吧
<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="com.example.xinxindemo.MainActivity" >
<com.example.xinxindemo.view.SecondSurfaceView
android:id="@+id/surfaceview"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="20"
/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="55dip"
android:orientation="horizontal"
android:padding="5dip" >
<Button
android:onClick="onClick"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:text="clean" />
</LinearLayout>
</LinearLayout>
对吧,界面不是很复杂,下面再看看这个SecondSurfaceView是怎么实现的;
/**
* 2016年7月26日17:20:13
* @author 小瓶盖 blog
*
*/
public class SecondSurfaceView extends SurfaceView implements SurfaceHolder.Callback,Runnable{
/**
* 是否处于绘制状态
*/
private boolean mIsDrawing;
/**
* 帮助类
*/
private SurfaceHolder mHolder;
/**
* 画布
*/
private Canvas mCanvas;
/**
* 路径
*/
private Path mPath;
/**
* 画笔
*/
private Paint mPaint;
public SecondSurfaceView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
initView();
}
public SecondSurfaceView(Context context, AttributeSet attrs) {
super(context, attrs);
initView();
}
public SecondSurfaceView(Context context) {
super(context);
initView();
}
@Override
public boolean onTouchEvent(MotionEvent event) {
int x=(int) event.getX();
int y=(int) event.getY();
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
mPath.moveTo(x, y);
break;
case MotionEvent.ACTION_MOVE:
mPath.lineTo(x, y);
break;
case MotionEvent.ACTION_UP:
break;
default:
break;
}
return true;
}
private void initView() {
mHolder=getHolder();
mHolder.addCallback(this);
setFocusable(true);
setFocusableInTouchMode(true);
this.setKeepScreenOn(true);
mPath=new Path();
mPaint=new Paint();
mPaint.setAntiAlias(true);
mPaint.setColor(Color.BLACK);
mPaint.setStyle(Style.STROKE);
mPaint.setStrokeWidth(15);
}
@Override
public void run() {
long start =System.currentTimeMillis();
while(mIsDrawing){
draw();
}
long end =System.currentTimeMillis();
if (end-start<100) {
try {
Thread.sleep(100-(end-start));
} catch (Exception e) {
e.printStackTrace();
}
}
}
@Override
public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) {
}
@Override
public void surfaceCreated(SurfaceHolder arg0) {
mIsDrawing=true;
new Thread(this).start();
}
@Override
public void surfaceDestroyed(SurfaceHolder arg0) {
mIsDrawing=false;
}
private void draw(){
try {
mCanvas=mHolder.lockCanvas();
mCanvas.drawColor(Color.WHITE);
mCanvas.drawPath(mPath, mPaint);
} catch (Exception e) {
e.printStackTrace();
}finally{
if (mCanvas!=null) {
mHolder.unlockCanvasAndPost(mCanvas);
}
}
}
/**
* 清除内容
*/
public void clean(){
initView();
}
}
然后就是MainActivity.java
/**
* 2016年7月26日17:20:13
* @author 小瓶盖 blog *
*/
public class MainActivity extends Activity{
SecondSurfaceView surfaceView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
surfaceView=(SecondSurfaceView)findViewById(R.id.surfaceview);
}
public void onClick(View v){
surfaceView.clean();
}
}
源码下载:http://xiazai.jb51.net/201607/yuanma/SurfaceView(jb51.net).rar


猜你喜欢
- 在AccessibilityService中我们可以做模拟操作,下面记述下通过AccessibilityService实现微信发红包的功能1
- 前言该设计是一款轻量级的便签工具,使用Android Studio开发,风格简练,可实现便签的添加、删除、修改、查看功能。为保证一定的安全性
- 本文实例为大家分享了JAVASE系统实现抽卡功能的具体代码,供大家参考,具体内容如下先看下文件结构使用到的知识点:看下Client类的实现:
- 我们在使用SpringData JPA框架时,进行条件查询,如果是固定条件的查询,我们可以使用符合框架规则的自定义方法以及@Query注解实
- 1、说明向上转型就是把一个子类引用给一个父类引用,也就是父类引用 引用了子类的对象,即父类 父类对象 = 子类实例。此时通过父类引用变量调用
- 目录前言代码一:代码二:方式一:方式二:方式三:总结前言之前写过多线程累加计数,原理跟本篇类似,传送门累加计数比计算数组之和逻辑稍微简单一点
- 这个例子很简单,直接上截图和代码。布局文件activity_copy.xml代码如下:<?xml version="1.0&
- 这篇文章主要介绍了springboot配置aop切面日志打印过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习
- 在使用Java web开发的后端工程师们大多会使用Maven作为项目构建以及编译的工具,微服务和大中台当道的今天,更加关注maven的细节是
- 如何解决Mybatis--java.lang.IllegalArgumentException: Result Maps collection already contains value for X这两天因为项目需要整合spring、struts2、mybatis三大框架,但启动的时候总出现这个错误,困扰我好久,在网上找到的答案都不是我
- 本文实例讲述了Spring与Struts整合之让Spring管理控制器操作。分享给大家供大家参考,具体如下:一 Web配置<?xml
- 本文主要解决以下几个问题:我们都知道Android的刷新频率是60帧/秒,这是不是意味着每隔16ms就会调用一次onDraw方法?如果界面不
- Feign多参数传递及注意的问题这边沿用前面的Eureka,Feign,Service在服务提供者cloud-shop-userservic
- 引言本文收集了我在看Lucene源码中遇到的所有的对单值(int,long,float,double)的压缩算法,可能一种类型针对不同的场景
- 1. 缓存、两级缓存1.1 内容说明Spring cache:主要包含spring cache定义的接口方法说明和注解中的属性说明sprin
- 一个发送验证码的需求:包括限制文本框输入长度和只允许输入数字按惯例 先上图:class MyBody extends StatefulWid
- 一、分析源码我们学完之前的框架,大概知道静态资源过滤是由mvc处理的,然后在分析自动装配的时候会遇到WebMvcAutoConfigurat
- 一、简介SpringBoot 中给普通变量注入值只需在变量上添加 @Value 注解即可。application.properties 配置
- 今天一位同事想写一个全屏幕截图的代码。当然要实现的第一步是能够获取整个屏幕的位图,记得Win32 API的CreateDC, BitBlt等
- 介绍: Mybatis-Plus(简称MP)