SufaceView初步认识—— 简单实用(画正弦波)

本文介绍了如何在Android应用中使用SurfaceView组件动态绘制正弦波,并通过按钮控制绘制方式,实现一次绘制或逐渐绘制的效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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" >

    <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>


2.此项目中唯一的Activity的代码如下:


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 {
  //点击左边的按钮正弦波一次性画完,点击右边的按钮正弦波逐渐画完
  Button btnSimpleDraw, btnTimerDraw;

  SurfaceView surfaceView;

  SurfaceHolder surfaceHolder;

  private Timer mTimer;

  private MyTimerTask myTimerTask;


  int Y_axis[],// 保存正弦波的Y 轴上的点
      centerY,// SurfaceView 垂直中间位置Y坐标轴的坐标
      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());
    surfaceView = (SurfaceView) this.findViewById(R.id.SurfaceView01);
    surfaceHolder = surfaceView.getHolder();
    // 动态绘制正弦波的定时器
    mTimer = new Timer();
    myTimerTask = new MyTimerTask();
    // 初始化y 轴数据
    centerY = (getWindowManager().getDefaultDisplay().getHeight() - surfaceView
        .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) {
        mTimer.cancel();
        mTimer.purge();
        myTimerTask = null;
        ClearDraw();
        oldX = 0;
        oldY = 0;
        SimpleDraw(Y_axis.length - 1);// 直接绘制正弦波

      }
      else if (v == btnTimerDraw) {

        if (myTimerTask == null) {
          ClearDraw();
          mTimer = new Timer();
          currentX = 0;
          myTimerTask = new MyTimerTask();
          mTimer.schedule(myTimerTask, 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 = surfaceHolder.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];
      if (i != 1) {
        canvas.drawLine(oldX, oldY, i, y, mPaint);
      }
      oldX = i;
      oldY = y;
    }
    surfaceHolder.unlockCanvasAndPost(canvas);//绘画完成之后, 解锁画布,提交画好的图像
  }

  void ClearDraw() {
    Canvas canvas = surfaceHolder.lockCanvas(null);
    canvas.drawColor(Color.BLACK);// 清除画布
    surfaceHolder.unlockCanvasAndPost(canvas);
  }

}


3.效果图如下:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值