php网上在线学习,使用SurfaceView绘制静态图像

使用 SurfaceView 绘图需要为 SurfaceView 对象添加 SurfaceHoloder.Callback 接口,并在该接口的 surfaceCreated() 方法中通过 lockCanvas() 方法获取 Canvas 对象,以此保证当获取 Canvas 时,SurfaceView 对象可用。

当绘图工作完成后,通过 SurfaceHoloder.unlockCanvas-AndPost() 方法将绘制的图像显示出来,并释放 Canvas 对象。

实例 SurfaceViewDrawDemo 演示了使用 SurfaceView 组件绘制静态图像的过程,其绘制的内容与《Android使用Bitmap绘图实例》教程中绘制的内容完全相同。

通过该实例,我们可以清楚地认识到使用 SurfaceView 绘图与使用 View 绘图的不同之处,该实例运行效果如图 1 所示。

d8c5b297f0af329f89546d8d904d6835.png

图 1  SurfaceView 绘图效果

实例 SurfaceViewDrawDemo 使用的布局文件 main.xml 内容如下:

android:layout_width="fill_parent"

android:layout_height="fill_parent"

android:orientation="vertical">

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:text="@string/hello" />

android:id="@+id/surfaceViewl"

android:layout_width="fill_parent"

android:layout_height="fill_parent" />

在 LinearLayout 布局中添加了一个 SurfaceView 组件,通过该组件进行绘图。

实例 SurfaceViewDrawDemo 的主 Activity 为 SurfaceDrawDemoActivity,其代码如下:

import android.app.Activity;

import android.graphics.Canvas;

import android.graphics.Color;

import android.graphics.Paint;

import android.graphics.Path;

import android.graphics.RectF;

import android.os.Bundle;

import android.view.SurfaceHolder;

import android.view.SurfaceView;

public class SurfaceDrawDemoActivity extends Activity {

private SurfaceView mySurfaceView;

private float[] mPts;

private static final float SIZE = 300;

private static final int SEGS = 32;

private static final int X = 0;

private static final int Y = 1;

/**

* Called when the activity is first created.

*/

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

buildPoints();

mySurfaceView = (SurfaceView) findViewById(R.id.surfaceView1);

SurfaceHolder surfaceHolder = mySurfaceView.getHolder();

SurfaceHolder.addCallback(new SurfaceHolder.Callback() {

@Override

public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {

// TODO Auto-generated method stub

}

@Override

public void surfaceCreated(SurfaceHolder holder) {

//必须在该方法中获取Canvas对象,才能保证SurfaceView可用

Canvas canvas = holder.lockCanvas(); //获得canvas对象

//使用Canvas绘图

//画布移动到(10, 10)位置

canvas.translate(10, 10);

//画布使用白色填充

canvas.drawColor(Color.WHITE);

//创建红色画笔,使用单像素宽度,绘制直线

Paint paint = new Paint();

paint.setColor(Color.RED);

paint.setStrokeWidth(0);

canvas.drawLines(mPts, paint);

//创建蓝色画笔,宽度为3,绘制相关点

paint.setColor(Color.BLUE);

paint.setStrokeWidth(3);

canvas.drawPoints(mPts, paint);

//创建Path,并沿着path显示文字信息

RectF rect = new RectF(10, 250, 290, 480);

Path path = new Path();

path.addArc(rect, -180, 180);

paint.setTextSize(18);

paint.setColor(Color.BLUE);

canvas.drawTextOnPath("在SurfaceView中使用Canvas对象绘制静态图实例", path, 0,

0, paint);

holder.unlockCanvasAndPost(canvas); //释放canvas对象

}

@Override

public void surfaceDestroyed(SurfaceHolder holder) {

// TODO Auto-generated method stub

}

});

}

private void buildPoints() {

//生成一系列点

final int ptCount = (SEGS + 1) * 2;

mPts = new float[ptCount * 2];

float value = 0;

final float delta = SIZE / SEGS;

for (int i = 0; i <= SEGS; i++) {

mPts[i * 4 + X] = SIZE - value;

mPts[i * 4 + Y] = 0;

mPts[i * 4 + X + 2] = 0;

mPts[i * 4 + Y + 2] = value;

value += delta;

}

}

}

1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 、4下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合;、下载 4使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合;、 4下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
以下是使用SurfaceView绘制正弦波的示例代码: 首先,在布局文件中添加SurfaceView: ```xml <SurfaceView android:id="@+id/surfaceView" android:layout_width="match_parent" android:layout_height="match_parent" /> ``` 然后,在Activity中获取SurfaceView引用,并使用一个新线程来绘制正弦波: ```java public class MainActivity extends AppCompatActivity { private SurfaceView surfaceView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); surfaceView = findViewById(R.id.surfaceView); // 使用新线程绘制正弦波 new Thread(new Runnable() { @Override public void run() { drawSinWave(); } }).start(); } private void drawSinWave() { // 获取SurfaceHolder引用 final SurfaceHolder holder = surfaceView.getHolder(); // 定义X,Y坐标轴的单位长度(每一个像素表示多少距离) final float xAxisUnit = 30f; final float yAxisUnit = 50f; // 获取SurfaceView的宽高 final int width = surfaceView.getWidth(); final int height = surfaceView.getHeight(); // 定义正弦函数的周期、振幅和相位 final float cycle = 2 * (float) Math.PI / xAxisUnit; final float amplitude = height / 4; final float phase = 0; while (true) { // 获取当前的Canvas对象 Canvas canvas = holder.lockCanvas(); if (canvas != null) { // 清空画布 canvas.drawColor(Color.WHITE); // 绘制坐标轴 paint.setColor(Color.BLACK); paint.setStrokeWidth(2f); canvas.drawLine(0f, height / 2f, width, height / 2f, paint); canvas.drawLine(width / 2f, 0f, width / 2f, height, paint); // 绘制正弦波 paint.setColor(Color.BLUE); paint.setStrokeWidth(3f); float lastX = 0f, lastY = 0f; for (float x = 0; x <= width; x += 1) { float y = (float) (amplitude * Math.sin(cycle * (x / xAxisUnit) + phase)) + height / 2f; if (x > 0) { canvas.drawLine(lastX, lastY, x, y, paint); } lastX = x; lastY = y; } // 释放当前的Canvas对象 holder.unlockCanvasAndPost(canvas); } // 暂停一定时间后再重新绘制 try { Thread.sleep(10); } catch (InterruptedException e) { e.printStackTrace(); } } } } ``` 以上代码中,我们将绘制正弦波的代码放入了一个循环中,以便不断地更新SurfaceView上的内容。 具体细节见注释。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值