Android SurfaceView实现静态于动态画图效果
本文是基于Android的SurfaceView的动态画图效果,实现静态和动态下的正弦波画图,可作为自己做图的简单参考,废话不多说,先上图,
静态效果:

动态效果:

比较简单,代码注释的也比较详细,易懂,我就直接上代码了吧:
1.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" >
 - <SurfaceView
 - android:layout_width="fill_parent"
 - android:layout_height="600px"
 - android:id="@+id/surfaceview_draw"/>
 - <RelativeLayout android:layout_width="fill_parent"
 - android:layout_height="wrap_content">
 - <Button android:layout_below="@id/surfaceview_draw"
 - android:layout_marginLeft="7dip"
 - android:id="@+id/simpledraw_btn"
 - android:text="简单绘图"
 - android:layout_width="wrap_content"
 - android:layout_height="wrap_content"
 - android:textSize="20dip"/>
 - <Button
 - android:id="@+id/timerdraw_btn"
 - android:layout_width="wrap_content"
 - android:layout_height="wrap_content"
 - android:layout_toRightOf="@id/simpledraw_btn"
 - android:text="定时绘图"
 - android:textSize="20dip"/>
 - <Button
 - android:id="@+id/cleardraw_btn"
 - android:layout_width="wrap_content"
 - android:layout_height="wrap_content"
 - android:layout_toRightOf="@id/timerdraw_btn"
 - android:text="清除图像"
 - android:textSize="20dip"/>
 - </RelativeLayout>
 - </LinearLayout>
 
2.SurfaceViewDrawActivity.java
- package com.huangcheng.draw;
 - 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.view.View.OnClickListener;
 - import android.widget.Button;
 - public class SurfaceViewDrawActivity extends Activity {
 - /** Called when the activity is first created. */
 - private SurfaceView surface_draw;
 - private SurfaceHolder surfaceholder;
 - private Button simpledraw_btn;
 - private Button timerdraw_btn;
 - private Button cleardraw_btn;
 - private Timer timer;
 - private TimerTask timertask;
 - private int[] Y;// 保存图像Y轴上的点
 - private int centerY, oldX, oldY, currentX;// 保存水平中心线位置,上一个(x,y)点,当先绘制到的x
 - ;
 - @Override
 - public void onCreate(Bundle savedInstanceState) {
 - super.onCreate(savedInstanceState);
 - setContentView(R.layout.main);
 - surface_draw = (SurfaceView) findViewById(R.id.surfaceview_draw);
 - surfaceholder = surface_draw.getHolder();
 - simpledraw_btn = (Button) findViewById(R.id.simpledraw_btn);
 - timerdraw_btn = (Button) findViewById(R.id.timerdraw_btn);
 - cleardraw_btn = (Button) findViewById(R.id.cleardraw_btn);
 - cleardraw_btn.setEnabled(false);
 - centerY = ;
 - Y = new int[getWindowManager().getDefaultDisplay().getWidth()];
 - ; i < Y.length + ; i++) {
 - Y[i - ] = centerY + ( * Math.sin(i * * Math.PI / ));
 - // System.out.println("sin:"+100*Math.sin(i*2*Math.PI/180));
 - }
 - simpledraw_btn.setOnClickListener(new OnClickListener() {
 - @Override
 - public void onClick(View arg0) {
 - // TODO Auto-generated method stub
 - simpledraw();// 静态绘制正弦图
 - signal=;
 - simpledraw_btn.setEnabled(false);
 - timerdraw_btn.setEnabled(false);
 - cleardraw_btn.setEnabled(true);
 - }
 - });
 - timerdraw_btn.setOnClickListener(new OnClickListener() {
 - @Override
 - public void onClick(View arg0) {
 - // TODO Auto-generated method stub
 - oldX=;
 - oldY=centerY;
 - currentX=;
 - timer=new Timer();
 - timertask=new TimerTask() {
 - @Override
 - public void run() {
 - // TODO Auto-generated method stub
 - currentX++;
 - complexdraw(currentX);
 - ){
 - ClearDraw();
 - currentX = ;
 - oldX=;
 - oldY=centerY;
 - }
 - }
 - };
 - timer.schedule(timertask, , );// 动态绘制正弦图
 - signal=;
 - simpledraw_btn.setEnabled(false);
 - timerdraw_btn.setEnabled(false);
 - cleardraw_btn.setEnabled(true);
 - }
 - });
 - cleardraw_btn.setOnClickListener(new OnClickListener() {
 - @Override
 - public void onClick(View arg0) {
 - // TODO Auto-generated method stub
 - ){
 - ClearDraw();
 - simpledraw_btn.setEnabled(true);
 - timerdraw_btn.setEnabled(true);
 - }
 - ){
 - timertask.cancel();
 - timer.cancel();
 - ClearDraw();
 - simpledraw_btn.setEnabled(true);
 - timerdraw_btn.setEnabled(true);
 - }
 - }
 - });
 - }
 - // 简单画图
 - void simpledraw() {
 - oldX = ;
 - oldY = centerY;
 - Canvas canvas = surfaceholder
 - .lockCanvas(, oldX + Y.length,
 - getWindowManager().getDefaultDisplay().getHeight()));// 关键:获取画布
 - Log.i("Canvas:X:",
 - String.valueOf(oldX) + "," + String.valueOf(oldX + Y.length));
 - Paint mPaint = new Paint();
 - mPaint.setColor(Color.GREEN);// 画笔为绿色
 - mPaint.setStrokeWidth();// 设置画笔粗细
 - int y;
 - ; i < Y.length; i++) {// 绘画正弦波
 - y = Y[i - ];
 - canvas.drawLine(oldX, oldY, i, y, mPaint);
 - // System.out.println("oldX:"+oldX+" oldY:"+oldY+",x:"+i+" y:"+y);
 - oldX = i;
 - oldY = y;
 - }
 - surfaceholder.unlockCanvasAndPost(canvas);
 - }
 - // 消除画得图
 - void ClearDraw() {
 - Canvas canvas = surfaceholder.lockCanvas(null);
 - canvas.drawColor(Color.BLACK);// 清除画布
 - surfaceholder.unlockCanvasAndPost(canvas);
 - }
 - //动态画图
 - void complexdraw(int current){
 - Canvas canvas = surfaceholder
 - .lockCanvas(, current,
 - getWindowManager().getDefaultDisplay().getHeight()));// 关键:获取画布
 - Log.i("Canvas:X:",
 - String.valueOf(oldX) + "," + String.valueOf(oldX + Y.length));
 - Paint mPaint = new Paint();
 - mPaint.setColor(Color.GREEN);// 画笔为绿色
 - mPaint.setStrokeWidth();// 设置画笔粗细
 - ];
 - canvas.drawLine(oldX, oldY, current, y, mPaint);
 - // System.out.println("oldX:"+oldX+" oldY:"+oldY+",x:"+i+" y:"+y);
 - oldX = current;
 - oldY = y;
 - surfaceholder.unlockCanvasAndPost(canvas);
 - }
 - }
 
Android SurfaceView实现静态于动态画图效果的更多相关文章
- 关于Android中Fragment静态和动态加载的方法
		
一.静态加载 1.首先创建一个layout布局fragment.xml,里面放要显示和操作的控件 2.创建一个layout布局main1.xml,用来实现页面的跳转(跳转为要实现静态加载的界面) 3. ...
 - Android中BroadcastReceiver的两种注册方式(静态和动态)详解
		
今天我们一起来探讨下安卓中BroadcastReceiver组件以及详细分析下它的两种注册方式. BroadcastReceiver也就是"广播接收者"的意思,顾名思义,它就是用来 ...
 - Android使用SurfaceView实现墨迹天气的风车效果
		
SurfaceView也是继承自View,它和我们以前接触到的View(Button.TextView等)最大的不同是,SurfaceView可以有一个单独的线程进行绘制,这个线程区别于UI线程(主线 ...
 - android 静态和动态设置 Receiver的 android:enabled值
		
0x 01 前提约束: 0x001 静态检查:指用action限定Intent,并使用包管理器的queryBroadCastReceivers方法,在flags字段置为0时查找ResolveInfo, ...
 - Android自定义控件 -Canvas绘制折线图(实现动态报表效果)
		
有时候我们在项目中会遇到使用折线图等图形,Android的开源项目中为我们提供了很多插件,但是很多时候我们需要根据具体项目自定义这些图表,这一篇文章我们一起来看看如何在Android中使用Canvas ...
 - android优化中国风应用、完整NBA客户端、动态积分效果、文件传输、小说阅读器等源码
		
Android精选源码 android拖拽下拉关闭效果源码 一款优雅的中国风Android App源码 EasySignSeekBar一个漂亮而强大的自定义view15 android仿蘑菇街,蜜芽宝 ...
 - Android原理揭秘系列之一动态墙纸
		
Livewallpaper,即动态墙纸,是Android的一大3D特色功能,用户可以在桌面选择加载动态墙纸,让自己的手机桌面背景旋动起来. 相对于静态桌面壁纸,动态墙纸可以展示各种动态变化的背景,而与 ...
 - Android SurfaceView实战 带你玩转flabby bird (下)
		
转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/43063331,本文出自:[张鸿洋的博客] 1.概述 在Android Surfa ...
 - Android SurfaceView实战 带你玩转flabby bird (上)
		
转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/42965779 ,本文出自:[张鸿洋的博客] 1.概述 哈,记得以前写过Andro ...
 
随机推荐
- BZOJ 3038: 上帝造题的七分钟2
			
3038: 上帝造题的七分钟2 Description XLk觉得<上帝造题的七分钟>不太过瘾,于是有了第二部. "第一分钟,X说,要有数列,于是便给定了一个正整数数列. 第二分 ...
 - HDU1163【九余数定理】【水题】
			
Eddy's digital Roots Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Oth ...
 - stm32之595(spi芯片)
			
595是一款串转并的芯片: (三极管的功能) /*Include---------------------------*/ #include"stm32f10x_lib.h" / ...
 - 【Linux命令】命令行查找文件并进行操作
			
查找: #找./下的所有txt文件,输出个数 find ./ -name "*.txt" | wc -l #查找并删除 find ./ -name "*.txt" ...
 - PigCms 回复消息 "域名授权错误! 您使用的微信平台或源码为盗版"
			
本文地址:http://duwei.cnblogs.com/ Pigcms 将自动回复的API 写死了, 这里提供一个可用的API 在 PigCms/Lib/Action/Home/Weixinact ...
 - currentStyle和getComputedStyle的兼容写法
			
今天学习javascript的时候,教程中介绍了一种简单实现jQuery 中css()方法的写法 <!DOCTYPE html> <html lang="en"& ...
 - windows下apache+wsgi+web.py环境搭建
			
首先安装好wsgi模块并启用:1.下载地址:我本机是python2.7 http://code.google.com/p/modwsgi/downloads/detail?name=mod_wsgi- ...
 - 《算法导论》读书笔记之图论算法—Dijkstra 算法求最短路径
			
自从打ACM以来也算是用Dijkstra算法来求最短路径了好久,现在就写一篇博客来介绍一下这个算法吧 :) Dijkstra(迪杰斯特拉)算法是典型的最短路径路由算法,用于计算一个节点到其他所有节点的 ...
 - form验证及图片上传
			
form验证及图片上传 这一节增加推荐图书的提交和删除功能,来学习node的form提交以及node的图片上传功能.开始之前需要源码同学可以先在git上fork:https://github.com/ ...
 - ognl--数据运转的催化剂
			
原文链接:http://struts2.group.iteye.com/group/wiki/1353-ognl-catalyst-for-data-operation-in-struts2 首先让我 ...