读书人

SurfaceView的运用例子

发布时间: 2012-06-27 14:20:09 作者: rapoo

SurfaceView的使用例子
转载自: http://blog.csdn.net/hellogv/article/details/5985090

效果图:


例子:
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>



SurfaceviewActivity.java
package com.surface;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 SurfaceviewActivity 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];            System.out.println("oldX:"+oldX+"    oldY:"+oldY+"   i:"+i+"    y:"+y);            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);        }}

读书人网 >移动开发

热点推荐