Android SurfaceView简例

Android中各的SurfaceView和View有很大的不同,两者应用场景不同。大多数View能做的事情SurfaceView也可以,但是SurfaceView效率更高。Android的View绘制过程由Android系统控制,刷新机制开发者比较难以控制。而SurfaceView支持高频、多线程绘制。SurfaceView不存在是否在Android UI主线程绘制问题。通常SurfaceView用于游戏、多媒体(视频)开发。
现在给出一个例子。

写一个自定义的SurfaceView,MySurfaceView.java:

package zhangphil.view;import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.view.SurfaceHolder;
import android.view.SurfaceView;/*** Created by Phil on 2017/9/12.*/public class MySurfaceView extends SurfaceView {public MySurfaceView(Context context, AttributeSet attrs) {super(context, attrs);init();}private void init() {SurfaceHolder holder = getHolder();final MyTask task = new MyTask(holder);holder.addCallback(new SurfaceHolder.Callback() {@Overridepublic void surfaceCreated(SurfaceHolder surfaceHolder) {task.startTask();}@Overridepublic void surfaceChanged(SurfaceHolder surfaceHolder, int format, int width, int height) {}@Overridepublic void surfaceDestroyed(SurfaceHolder surfaceHolder) {task.stopTask();}});}private class MyTask extends Thread {private int width;private int height;private SurfaceHolder surfaceHolder;private Paint paint;private float radius = 0;public boolean stopTask = false;public MyTask(SurfaceHolder surfaceHolder) {this.surfaceHolder = surfaceHolder;paint = new Paint();paint.setAntiAlias(true);paint.setColor(Color.RED);paint.setStyle(Paint.Style.STROKE);paint.setStrokeWidth(10f);}public void startTask() {stopTask = false;this.start();}public void stopTask() {stopTask = true;}@Overridepublic void run() {while (!stopTask) {try {Thread.sleep(1);} catch (Exception e) {e.printStackTrace();}Canvas canvas = surfaceHolder.lockCanvas();width = getWidth();height = getHeight();canvas.drawColor(Color.WHITE);canvas.drawCircle(width / 2, height / 2, radius++, paint);surfaceHolder.unlockCanvasAndPost(canvas);//如果半径大于边界,置0.if (radius >= (width / 2)) {radius = 0;}}}}
}

测试的activity_main.xml:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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:background="@android:color/holo_blue_light"tools:context="zhangphil.view.MainActivity"><zhangphil.view.MySurfaceViewandroid:layout_width="150dp"android:layout_height="150dp"android:layout_centerInParent="true" />
</RelativeLayout>

代码运行结果:

Android SurfaceView简例相关推荐

  1. Android RuntimePermissions运行时权限:单个运行时权限申请简例

    Android RuntimePermissions运行时权限:单个运行时权限申请简例 Android运行时权限申请的框架结构和步骤比较简单和固定,一般现状代码启动后检查当前的Android SDK版 ...

  2. 详解与重构hyman《Android SurfaceView实战 打造抽奖转盘》

    详解与重构hyman<Android SurfaceView实战 打造抽奖转盘> 作者:邵励治 一.概述--关于SurfaceView您不得不知道的二三事 1.SurfaceView是干什 ...

  3. Android应用--简、美音乐播放器获取专辑图片(自定义列表适配器)

    Android应用--简.美音乐播放器获取专辑图片(自定义列表适配器) 2013年7月3日简.美音乐播放器开发 第二阶段已增加功能: 1.歌词滚动显示 2.来电监听 3.音量控制 4.左右滑动切换歌词 ...

  4. oracle供应商导入,AP供应商导入简例.pdf

    AP供应商导入简例 Oracle 完全测试记录 供应商导入 吴若童 总述总述 总述总述 供应商供应商接口接口的原理的原理?? 供应商供应商接口接口的原理的原理?? 系统从三个表分别导入供应商.供应商地 ...

  5. 5.3linux下C语言socket网络编程简例

    原创文章,转载请注明转载字样和出处,谢谢! 这里给出在Linux下的简单socket网络编程的实例,使用tcp协议进行通信,服务端进行监听,在收到客户端的连接后,发送数据给客户端:客户端在接受到数据后 ...

  6. Ansible 入门:安装 简例 playbook应用

    Mysql 内:select unix_timestamp('2016-10-20')  <---> select from_unixtime(147662104) 转时间戳:date + ...

  7. Android应用--简、美音乐播放器增加音量控制

    Android应用--简.美音乐播放器增加音量控制 2013年6月26日简.美音乐播放器继续完善中.. 题外话:上一篇博客是在6月11号发的,那篇博客似乎有点问题,可能是因为代码结构有点乱的原因,很难 ...

  8. 17.scrapy框架简例使用

    17.scrapy框架简例使用 目标:创建scrapy项目 创建一个spider来抓取站点和处理数据 通过命令行将抓取内容导出 1.创建项目 scrapy startproject tutorial ...

  9. Android应用--简、美音乐播放器原型放送(作者:小巫)

    Android应用--简.美音乐播放器原型放送 2013年7月5日简.美音乐播放器开发 前言:小巫的简.美音乐播放器从5月7号开始开发,之前以为时间很充足,也没有估量整个软件的需求,如果简单实现基本的 ...

最新文章

  1. 配置flutter For IOS
  2. R语言ggplot2可视化使用不连续的y轴、中断的Y轴来可视化数值分布差异很大的数据实战:把数据轴分为两个区间或者多个区间来匹配不同区间数据的可视化(因为有的数据可能10附近,有的数值可能1W附近)
  3. .Net中单元测试工具的比较(Moq, VS Fake, TypeMock)
  4. android返回键方法,Android按返回键(后退键)Back键事件捕获的两种方法
  5. 聊聊高并发(二十七)解析java.util.concurrent各个组件(九) 理解ReentrantLock可重入锁
  6. c语言中if条件语句说课内容,if语句-ppt-说课--试讲-C语言.ppt
  7. android传感器获取运动方向,Android开发者指南-运动传感器Motion Sensor[原创译文]...
  8. C++调用matlab dll
  9. 机器学习问题总结(01)
  10. Leetcode算法题(C语言)3--买卖股票的最佳时机 II
  11. 干货!Python与MySQL数据库的交互实战
  12. Jetty提交数据时报java.lang.IllegalStateException: Form too large270468>200000问题解决
  13. Javascript第五章document对象获取标签节点-第六课
  14. ffmpeg 图像格式转换
  15. 向量积和数量积常用知识
  16. 一梦江湖带你走进真正的武侠世界!
  17. android平板能玩吃鸡吗,吃鸡不卡的安卓平板
  18. TI 高精度实验室《运算放大器系列--稳定性分析》
  19. MySQL实现主主同步(三台服务器)
  20. 鲁照山思考致富六步学习方法

热门文章

  1. 网络短信知识: 上行与下行,短信特服号,短信收发过程,短信通道
  2. OpenGL中的glLoadIdentity、glTranslatef、glRotatef原理
  3. 【C语言练习——交换两个变量的值】
  4. 小程序生命周期(onLaunch、onShow、onHide、onReady、onLoad、onUnloa)
  5. 分享一个Chrome小技巧---多用户登录同一网站不串信息
  6. Android:Loading 动画——竜人の剣を喰え
  7. Linux下的USB总线驱动(三) u盘驱动分析
  8. 数值 ELO算法教程
  9. 【恒指早盘分析】10.8恒指今日复盘及后市思路
  10. 发一个找了很久的acadia的接口图吧