SurfaceView 由于可以直接从内存或者DMA等硬件接口取得图像数据,因此是个非常重要的绘图容器,网上介绍 SurfaceView的用法有很多,写法也层出不同,例如继承SurfaceView类,或者继承SurfaceHolder.Callback类等,这个可以根据功能实际需要自己选择,我这里就直接在普通的用户界面调用SurfaceHolder的lockCanvas和 unlockCanvasAndPost。

对比下面的第二、三两图,三图用.lockCanvas(null),而二图用.lockCanvas(new Rect(oldX, 0, oldX + length, getWindowManager().getDefaultDisplay().getHeight())),对比一下两个效果,由于二图是按指定Rect绘画,所以效率会比三图的全控件绘画高些,并且在清屏之后 (canvas.drawColor(Color.BLACK))不会留有上次绘画的残留。

main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="fill_parent" android:layout_height="fill_parent"android:orientation="vertical"><LinearLayout android:id="@+id/LinearLayout01"android:layout_width="wrap_content" android:layout_height="wrap_content"><Button android:id="@+id/Button01" android:layout_width="wrap_content"android:layout_height="wrap_content" android:text="简单绘画"></Button><Button android:id="@+id/Button02" android:layout_width="wrap_content"android:layout_height="wrap_content" android:text="定时器绘画"></Button></LinearLayout><SurfaceView android:id="@+id/SurfaceView01"android:layout_width="fill_parent" android:layout_height="fill_parent"></SurfaceView>
</LinearLayout>

  

TestSurfaceView.java

package com.testSurfaceView;import java.util.Timer;
import java.util.TimerTask;import android.app.Activity;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.os.Bundle;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.widget.Button;public class TestSurfaceView extends Activity {/** Called when the activity is first created. */Button btnSimpleDraw, btnTimerDraw;SurfaceView sfv;SurfaceHolder sfh;private Timer mTimer;private MyTimerTask mTimerTask;int Y_axis[],//保存正弦波的Y轴上的点centerY,//中心线oldX,oldY,//上一个XY点 currentX;//当前绘制到的X轴上的点@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);btnSimpleDraw = (Button) this.findViewById(R.id.Button01);btnTimerDraw = (Button) this.findViewById(R.id.Button02);btnSimpleDraw.setOnClickListener(new ClickEvent());btnTimerDraw.setOnClickListener(new ClickEvent());sfv = (SurfaceView) this.findViewById(R.id.SurfaceView01);sfh = sfv.getHolder();//动态绘制正弦波的定时器mTimer = new Timer();mTimerTask = new MyTimerTask();// 初始化y轴数据centerY = (getWindowManager().getDefaultDisplay().getHeight() - sfv.getTop()) / 2;Y_axis = new int[getWindowManager().getDefaultDisplay().getWidth()];for (int i = 1; i < Y_axis.length; i++) {// 计算正弦波Y_axis[i - 1] = centerY- (int) (100 * Math.sin(i * 2 * Math.PI / 180));}}class ClickEvent implements View.OnClickListener {@Overridepublic void onClick(View v) {if (v == btnSimpleDraw) {SimpleDraw(Y_axis.length-1);//直接绘制正弦波} else if (v == btnTimerDraw) {oldY = centerY;mTimer.schedule(mTimerTask, 0, 5);//动态绘制正弦波}}}class MyTimerTask extends TimerTask {@Overridepublic void run() {SimpleDraw(currentX);currentX++;//往前进if (currentX == Y_axis.length - 1) {//如果到了终点,则清屏重来ClearDraw();currentX = 0;oldY = centerY;}}}/*** 绘制指定区域*/void SimpleDraw(int length) {if (length == 0)oldX = 0;Canvas canvas = sfh.lockCanvas(new Rect(oldX, 0, oldX + length,getWindowManager().getDefaultDisplay().getHeight()));// 关键:获取画布Log.i("Canvas:",String.valueOf(oldX) + "," + String.valueOf(oldX + length));Paint mPaint = new Paint();mPaint.setColor(Color.GREEN);// 画笔为绿色mPaint.setStrokeWidth(2);// 设置画笔粗细int y;for (int i = oldX + 1; i < length; i++) {// 绘画正弦波y = Y_axis[i - 1];canvas.drawLine(oldX, oldY, i, y, mPaint);oldX = i;oldY = y;}sfh.unlockCanvasAndPost(canvas);// 解锁画布,提交画好的图像}void ClearDraw() {Canvas canvas = sfh.lockCanvas(null);canvas.drawColor(Color.BLACK);// 清除画布sfh.unlockCanvasAndPost(canvas);}
}

  

http://www.oschina.net/code/snippet_54100_1423

转载于:https://www.cnblogs.com/jqyp/archive/2012/01/01/2309682.html

Android SurfaceView 的应用相关推荐

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

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

  2. Android SurfaceView实战 带你玩转flabby bird (下)

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/43063331,本文出自:[张鸿洋的博客] 1.概述 在Android Surfa ...

  3. Android SurfaceView实战 带你玩转flabby bird (上)

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 转载请标 ...

  4. Android SurfaceView实战 带你玩转flabby bird

    分析 仔细观察游戏,需要绘制的有:背景.地板.鸟.管道.分数: 游戏开始时: 地板给人一种想左移动的感觉: 管道与地板同样的速度向左移动: 鸟默认下落: 当用户touch屏幕时,鸟上升一段距离后,下落 ...

  5. Android SurfaceView简例

    Android SurfaceView简例 Android中各的SurfaceView和View有很大的不同,两者应用场景不同.大多数View能做的事情SurfaceView也可以,但是Surface ...

  6. android屏幕底部黑块,Android surfaceView 黑块问题

    很多Android机上会出现surfaceView结束播放后,出现概率的黑块,典型的解决方案 setZOrderMediaOverlay(false); setZorderTop(false); /* ...

  7. android SurfaceView

    为什么80%的码农都做不了架构师?>>>    参考:http://blog.csdn.net/luoshengyang/article/details/8661317/ 参考:ht ...

  8. Android SurfaceView的生命周期

    本文利用SurfaceView来实现视频的播放 本文地址:http://www.cnblogs.com/wuyudong/p/5851156.html,转载请注明源地址. 在main.xml布局文件添 ...

  9. android surfaceview 图片,为啥从SurfaceView中获取不到图片?

    一.普通View生成图片的原理 我们先来分析下从普通View中获取图片的方法.代码如下: public Bitmap getBitmapFromView(View view){ if (view == ...

最新文章

  1. IDEA设置单个文件、单个包、单个项目的编码格式
  2. 2019如何学Python?这里有你需要的答案
  3. Appium的DesiredCapabilities参数设置
  4. 快速排序(quicksort)算法实现
  5. ABAP几种内表的操作
  6. VTK:Utilities之ArrayWriter
  7. C# 接口(Interface)
  8. 中科院发布规范学术论著署名问题负面行为清单
  9. 数据导入导出、备份恢复
  10. python设置文件权限_Python os.chmod() 方法
  11. centos7 删除zabbix_Zabbix服务器端运行中显示为“不”的解决方式
  12. 对软件研发项目管理的深入探讨
  13. c++ vector 使用注意事项
  14. 算法:泽勒的一致性 给定一个日期,输出这个日期是该年一周中的星期几 【c++ java python版本】
  15. 群辉监控Surveillance Station不支持H265解决方案(解决群辉不支持的摄像头)
  16. 一个简洁的PNG ICO转换工具 支持多分辨率的ICO生成
  17. 计算机控制实验报告组态软件学习,中北大学组态软件实验报告
  18. git: Couldn‘t find remote ref
  19. 极限的无穷小和无穷大
  20. 求学贵在主动、坚持——兼谈学生行为礼仪

热门文章

  1. 过滤器在图纸上的符号_终于找全了,施工图纸上那一堆难记的符号,赶紧收藏!...
  2. vue 搜索框header_在Vue框架下使用Fullcalendar
  3. mysql分页的优势_数据库经典分页几种实例及各优缺点
  4. mybatis-plus 多列映射成数组_JavaScript 为什么需要类数组
  5. mysql中主从复制需要的酶_mysql主从复制
  6. SQL学习教程:基础教程高级教程
  7. floyd算法_最短路径的算法:Floyd算法
  8. 计算机为什么会出现网络用户,告诉你电脑显示无internet访问权限怎么办
  9. linux安装mysql5.6.26_linux mysql-5.6.26 安装
  10. vue避免重新渲染_小白也能懂的VUE的生命周期探寻