展会信息港展会大全

Android提高第二篇之SurfaceView(上)
来源:互联网   发布日期:2015-10-03 15:19:15   浏览:1830次  

导读:上次介绍MediaPlayer的时候稍微介绍了SurfaceView,SurfaceView由于可以直接从内存或者DMA等硬件接口取得图像数据,因此是个非常重要的绘图容器,这次我就用两篇文章来...

上次介绍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的源码:

view plaincopy to clipboardprint?<?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><?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>

接下来贴出程序源码:

view plaincopy to clipboardprint?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

赞助本站

人工智能实验室

相关热词: android开发 教程

AiLab云推荐
展开

热门栏目HotCates

Copyright © 2010-2024 AiLab Team. 人工智能实验室 版权所有    关于我们 | 联系我们 | 广告服务 | 公司动态 | 免责声明 | 隐私条款 | 工作机会 | 展会港