初学Android,图形图像之使用SurfaceView(四十)

SurfaceView跟View最大的不同就是,它可以局部更新Canvas,而不用像View一样,重绘整个画面

并且View的绘图必须在当前的UI线程中进行,当需要花较长时间更新绘图时,主UI线程就会阻塞,无法响应用户操作,而SurfaceView则不存在这个问题

下面是一个SurfaceView示波器的例子,貌似网上有好些人写过了


主界面

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent">
  <LinearLayout android:orientation="horizontal" android:layout_width="fill_parent" android:layout_height="wrap_content" android:gravity="center">
     <Button android:id="@+id/sin" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/sin" /> 
  <Button android:id="@+id/cos" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/cos" /> 
  </LinearLayout>
  <SurfaceView android:id="@+id/show" android:layout_width="fill_parent" android:layout_height="fill_parent" android:gravity="center" /> 
</LinearLayout>

string.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
  <string name="hello">Hello World, ShowWave!</string> 
  <string name="app_name">示波器</string> 
  <string name="sin">正弦曲线</string> 
  <string name="cos">余弦曲线</string> 
</resources>
主界面代码

package WangLi.Graphics.ShowWave;

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.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class ShowWave extends Activity {
    /** Called when the activity is first created. */
    private SurfaceHolder holder;
    private Paint paint;
    final int HEIGHT = 320;
    final int WIDTH = 320;
    final int X_OFFSET = 5;
    private int cx = X_OFFSET;
    //实际的Y轴的位置
    int centerY = HEIGHT / 2;
    Timer timer = new Timer();
    TimerTask task = null;
    
    private void drawBack(SurfaceHolder holder)
    {
    	Canvas canvas = holder.lockCanvas();
    	//绘制白色背景
    	canvas.drawColor(Color.WHITE);
    	Paint p = new Paint();
    	p.setColor(Color.BLACK);
    	p.setStrokeWidth(2);
    	//绘制坐标轴
    	canvas.drawLine(X_OFFSET, centerY, WIDTH, centerY, p);
    	canvas.drawLine(X_OFFSET, 40, X_OFFSET, HEIGHT, p);
    	holder.unlockCanvasAndPost(canvas);
    	holder.lockCanvas(new Rect(0 , 0 , 0 , 0));
    	holder.unlockCanvasAndPost(canvas);
    }
    
	@Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        final SurfaceView surface = (SurfaceView)findViewById(R.id.show);
        //初始化SurfaceHolder对象
        holder = surface.getHolder();
        paint = new Paint();
        paint.setColor(Color.GREEN);
        paint.setStrokeWidth(3);
        Button sin = (Button)findViewById(R.id.sin);
        Button cos = (Button)findViewById(R.id.cos);
        
        OnClickListener listener = (new OnClickListener(){
        	public void onClick(final View source)
        	{
        		drawBack(holder);
        		cx = X_OFFSET;
        		if(task != null)
        		{
        			task.cancel();
        		}
        		task = new TimerTask()
        		{
        			public void run()
        			{
        				int cy = source.getId() == R.id.sin ? centerY - (int)(100 * 
        						Math.sin((cx - 5) * 2 * Math.PI / 150))
        						: centerY - (int)(100 * Math.cos((cx - 5)
        								* 2 * Math.PI / 150));
        				Canvas canvas = holder.lockCanvas(new Rect(cx , cy - 2 , cx + 2 , cy + 2));
        				canvas.drawPoint(cx, cy, paint);
        				cx ++;
        				if(cx > WIDTH)
        				{
        					task.cancel();
        					task = null;
        				}
        				holder.unlockCanvasAndPost(canvas);
        			}
        		};
        		timer.schedule(task, 0, 30);
        	}
        });
        //给按钮挂载事件
        sin.setOnClickListener(listener);
        cos.setOnClickListener(listener);
    }
}



  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值