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

接触了这么久的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

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

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索android
, surfaceview
画板
surfaceview画板、自定义view画板、自定义surfaceview、surfaceview实现截图、surfaceview 实现圆角,以便于您获取更多的相关知识。

时间: 2025-01-25 12:01:28

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

Android自定义SurfaceView实现画板功能

接触了这么久的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 自定义手势--输入法手势技术_Android

进行软件开发时,通常我们都喜欢使用较新版本的工具,但这里我为什么使用低版本的SDK来开发Android游戏呢?这里介绍下原因:        1.Android SDK 属于向下兼容!那么低版本可以运行的,高版本基本上更是没问题!(当然每次SDK的更新也会带来新功能,或者修改了一些原来的BUG等等,那么其实对于游戏开发来说,如果你的游戏中不需要更高的SDK版本的支持情况下,完全不必去追求最新的SDK!)        2.使用低版本进行游戏开发这样能兼顾更多的机型,获取更多的用户!       

Android ShareSDK快速实现分享功能_Android

第一步 :获取ShareSDK 为了集成ShareSDK,您首先需要到ShareSDK官方网站注册并且创建应用,获得ShareSDK的Appkey,然后到SDK的下载页面下载SDK的压缩包,解压以后可以得到如下图的目录结构: ShareSDK在"ShareSDK for Android"目录下,此目录中的"Libs"包含"MainLibs"和"OnekeyShare" 分别是ShareSDK的核心库和"快捷分享&qu

Android自定义日历Calender代码实现_Android

产品要做签到功能,签到功能要基于一个日历来进行,所以就根据 要求自定义了一个日历 自定义控件相信做android都知道: (1)首先创建一个类,继承一个容器类或者是一个控件  (2)然后就是你需要设置的属性等的,在attrs文件夹中  (3)然后就是在类里边进行属性的设置以及布局等等功能的添加  其实自定义一个日历问题都不多,很多人都会想到通过一个gridView然后填充就可以,确实是这样,主要是在显示每个月的第一天的位置以及每个月显示多少天有点绕. 思路:通过判断当前星期几然后进行日历的填充,

Android中SurfaceView用法简单实例_Android

本文实例讲述了Android中SurfaceView用法.分享给大家供大家参考,具体如下: 这里贴上一个小程序代码,主要运用SurfaceView来实现在屏幕上画一个圆,你可以通过按方向键和触摸屏幕来改变圆的位置 代码: Activity: package com.view; import android.app.Activity; import android.os.Bundle; import android.view.Window; import android.view.WindowMa

Android自定义TitleView标题开发实例_Android

Android开发过程中,经常遇到一个项目需要重复的定义相同样式的标题栏,Android相继推出了actionBar, toolBar, 相信有用到的朋友也会遇到一些不如意的时候,比如标题栏居中时,需要自定义xml文件给toolBar等,不了解actionBar,toolBar的可以去找相应的文章了解,这里介绍自定义titleBar满足国内主题风格样式的情况. 为了提前看到效果,先上效果图: 前期准备 1.为标题栏titleView预定义id,在values下的ids.xml中 <?xml ve

Android自定义圆形倒计时进度条_Android

效果预览 源代码传送门:https://github.com/yanzhenjie/CircleTextProgressbar 实现与原理 这个文字圆形的进度条我们在很多APP中看到过,比如APP欢迎页倒计时,下载文件倒计时等. 分析下原理,可能有的同学一看到这个自定义View就慌了,这个是不是要继承View啊,是不是要绘制啊之类的,答案是:是的.但是我们也不要担心,实现这个效果实在是so easy.下面就跟我一起来看看核心分析和代码吧. 原理分析 首先我们观察上图,需要几个部分组成: 1. 外

Android自定义dialog简单实现方法_Android

本文实例讲述了Android自定义dialog简单实现方法.分享给大家供大家参考,具体如下: @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.function_music); // 实例化新的窗口 Window w = getWindow(); // 获取默认显示数据 Display display