Android提高第二篇之SurfaceView的基本使用

本文来自http://blog.youkuaiyun.com/hellogv/ ,引用必须注明出处!

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

先来看看程序运行的截图:

截图1主要演示了直接把正弦波绘画在SurfaceView上

对比上面的左右两图,右图用.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>

接下来贴出程序源码:

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轴上的点 @Override public 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 { @Override public 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 { @Override public 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); } }

注意一下 for (int i = oldX + 1; i < length; i++) {// 绘画正弦波 这句,在.lockCanvas()指定Rect内减少循环画线的次数,可以提高绘图效率。

时序定江山,功耗写风骨——解读时序库lib文件的奥义【芯片设计 lib文件】 lib库,全称liberty library format file:它是Liberty时序文件的简称,使用 Liberty 语法来编写。它可以通过library compiler/dc转换成.db文件(database),供synopsis家的DC和PT使用,也可以通过spyglass的library compiler来生成sglib文件,供spyglass使用。他们是等价的,但db文件是二进制格式,人类不可读。 阅读详情

相关推荐

TDDFT计算软件Octopus学习笔记(二):基态计算(Si)

本文以硅为例,来进行基态计算。

陈啸的博客 7305

Android使用自定义View时:Error inflating class错误的原因。

当在布局文件里使用自定义的View的时候,出现Error inflating class错误的原因: 1、没有定义inflate需要的默认构造函数;   eg:自定义View为TestView,需要定义TestView(Context context),TestView(Context context,AttributeSet set); 2、这是个内部类,需要声明为static才能infl...

weixin_33901926的博客 9715

地质工程师必备:Dips软件从数据导入到主结构面分析的完整流程解析

本文详细解析了地质工程师使用Dips软件进行主结构面分析的完整流程。从数据准备与导入、结构面分组与扇形区划分,到主结构面计算与工程解读,系统阐述了如何将野外节理数据转化为控制岩体稳定性的关键信息。重点介绍了利用等值线图识别优势组、计算统计主值及其置信椭圆,并强调了地质判断与工程应用结合的重要性。

table的专栏 341

Android提高第二篇之SurfaceView(上)

本文来自http://blog.csdn.net/hellogv/ ,引用必须注明出处! 上次介绍MediaPlayer的时候稍微介绍了SurfaceView,SurfaceView由于可以直接从内存或者DMA等硬件接口取得图像数据,因此是个非常重要的绘图容器,这次我就用两篇文章来介绍SurfaceView的用法。网上介绍SurfaceView的用法有很多,写法也层出不同,例如继承Surfac...

编程开发资料库 119

高效敏感词检测API平台对比与选型指南

本文为开发者提供了高效敏感词检测API平台的选型指南。文章对比了专业API平台、头部云厂商、新兴AI服务商及开源方案,从检测能力、集成易用性、成本、稳定性及扩展性五大维度进行分析,并给出实战选型建议,帮助团队根据业务场景快速选择最合适的敏感词检测服务。

weixin_29325955的博客 342

IMU660RA姿态解算实战:从传感器滤波到欧拉角输出的完整实现

本文详细介绍了IMU660RA姿态解算的完整实现过程,从传感器滤波到欧拉角输出。通过实战案例和代码示例,展示了如何有效处理陀螺仪和加速度计的噪声问题,并选择合适的算法进行数据融合和姿态解算。特别强调了欧拉角输出中的坐标系对齐和动态补偿技巧,帮助工程师快速掌握IMU660RA的应用。

weixin_42524762的博客 386

SurfaceView的几个基本步骤

public class GameSurfaceView extends SurfaceView implements SurfaceHolder.Callback, Runnable { // 控制循环 boolean mbLoop = false; // 定义SurfaceHolder对象 SurfaceHolder mSurfaceHolder = null; int m

struggling的专栏 1062

VS Code下载安装与使用教程

VSCode下载安装与使用教程

weixin_46713695的博客 4万+

Android:getHolder().lockCanvas()返回值为null原因及解决办法

Android lockCanvas()方法返回值为空解决方案

qjyws的博客 2175

详解AUTOSAR:DaVinci Configurator导入ARXML配置(拓展篇—2)

DaVinci Configurator导入ARXML配置。

不脱发的程序猿 3328

用 OData V2 元数据驱动表格体验:SAP UI5 Smart Table 全面解析

摘要: Smart Table是SAPUI5中基于OData元数据自动生成表格的控件,支持个性化、排序、过滤等高级功能。文章从九个维度深入解析其工作机制:1)通过元数据和注解自动生成列;2)支持多种表格类型;3)关键属性的静态化特性;4)与其他智能控件的协同;5)导航属性和导出的处理;6)响应式设计;7)个性化配置;8)性能优化策略;9)端到端实现案例。Smart Table通过读取OData元数据自动完成表格渲染,大幅减少开发工作量,特别适合企业级应用开发场景。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 321
上一篇: Android提高第一篇之MediaPlayer
下一篇: Android提高第三篇之SurfaceView与多线程的混搭
「已注销」
博客等级 码龄8年 1粉丝 6原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值