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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

时间: 2025-01-29 17:27:28

Android自定义SurfaceView实现画板功能的相关文章

Android自定义SurfaceView实现画板功能_Android

接触了这么久的View,总不能一直停留在View里,现在开始呢,就要学习一个新的知识点:SurfaceView,实际上SurfaceView与View的原理都差不多,只是效率和渲染方式上,SurfaceView要优于View,这也是我们写这个的原因.今天就看看这个SurfaceView,好了,下面就是今天要说的效果. 界面很简单,就是一个按钮以及一个画板,先看看界面的代码吧 <LinearLayout xmlns:android="http://schemas.android.com/ap

Android自定义View展开菜单功能的实现

先给大家展示下效果图,如果大家感觉不错,请参考实现代码. 思路 1.下角Button的父View加入一个FrameLayout,也就是图中全屏透明灰色部分. 菜单没有弹出的时候设置为不可见. 设置FrameLayout点击事件,点击的时候缩回菜单. 对应init() 2.rameLayout中加入菜单按钮,也就是弹出的那三个. 菜单没有弹出的时候设置为不可见. 对应addElement()和freshElement() 3.右下角的按钮,旋转图标(也可以不旋转). 对应setRotateAnim

Android 自定义SurfaceView详解

本文简单讨论以后Android游戏引擎模板的架构问题.在Android游戏开发教程之二:View类与SurfaceView类中我们已经谈到,SurfaceView类是有很多优势的,所以在Android游戏开发中还是选择SurfaceView. 这里我们直接继承SurfaceView,实现SurfaceHolder.Callback接口,处理surfaceCreated.surfaceChanged以及surfaceDestroyed方法,这里我们并没有把按键控制传入,最终游戏的控制方面仍然由Vi

Android自定义ListView实现仿QQ可拖拽列表功能_Android

我们大致的思路,其实是这样子的,也是我的设想,我们可以先去实现一个简单的ListView的数据,但是他的Adapter,我们可以用系统封装好的,然后传递进去一个实体类,最后自定义一个listview去操作,所以我们先把准备的工作做好,比如? list_item.xml <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.a

android 返回-关于android自定义返回功能的问题

问题描述 关于android自定义返回功能的问题 碰到一个问题,android程序里面. A界面跳转到B界面,用intent跳转的 ,在B界面自定义了返回响应,返回方法里面直接finish(). 有一个问题是,当从A界面跳转到B界面,然后程序切到后台之后,再点打开程序,在B界面点击返回按钮,就不返回到A界面了,程序直接退了. 网上查了一些资料,好像是切到后台之后堆栈就被清空了,请问大家怎么解决这个问题

Android自定义View仿支付宝输入六位密码功能_Android

跟选择银行卡界面类似,也是用一个PopupWindow,不过输入密码界面是一个自定义view,当输入六位密码完成后用回调在Activity中获取到输入的密码并以Toast显示密码.效果图如下: 自定义view布局效果图及代码如下: <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/

Android自定义View实现照片裁剪框与照片裁剪功能_Android

本文所需要实现的就是这样一种有逼格的效果: 右上角加了个图片框,按下确定可以裁剪正方形区域里的图片并显示在右上角. 实现思路: 1:首先需要自定义一个ZoomImageView来显示我们需要的图片,这个View需要让图片能够以合适的位置展现在当前布局的图片展示区域内(合适的位置值的是:如果图片长度大于屏幕,则压缩图片长度至屏幕宽度,高度等比压缩并居中显示,如果图片高度大于屏幕,则压缩图片高度至屏幕高度,长度等比压缩并居中显示.): 2:然后需要实现这个拖动的框框,该框框实现的功能有四点:拖动.扩

Android自定义listview布局实现上拉加载下拉刷新功能_Android

listview实现上拉加载以及下拉刷新的方式有很多.下面是我写的一种自定义的布局,复用性也比较的强.首先就是继承的listview的自定义view.      AutoListView.Java: package com.example.mic.testdemo.view; import android.annotation.TargetApi; import android.content.Context; import android.os.Build; import android.os

Android使用surfaceView自定义抽奖大转盘_Android

使用surfaceView自定义抽奖大转盘 话不多说,先上效果图 完整代码地址欢迎start 实现思路以及过程 1.首先了解SurfaceView的基本用法,它跟一般的View不太一样,采用的双缓存机制,可以在子线程中绘制View,不会因为绘制耗时而失去流畅性,这也是选择使用SurfaceView去自定义这个抽奖大转盘的原因,毕竟绘制这个转盘的盘块,奖项的图片和文字以及转动都是靠绘制出来的,是一个比较耗时的绘制过程. 2.使用SurfaceView的一般模板样式 一般会用到的成员变量 priva