android图像绘制(四)自定义一个SurfaceView控件

2016-02-19 10:43 8 1 收藏

今天图老师小编要向大家分享个android图像绘制(四)自定义一个SurfaceView控件教程,过程简单易学,相信聪明的你一定能轻松get!

【 tulaoshi.com - 编程语言 】

自定义控件(类似按钮等)的使用,自定义一个SurfaceView。
如某一块的动态图(自定义相应),或者类似UC浏览器下面的工具栏。
如下图示例
 
自定义类代码
代码如下:

public class ImageSurfaceView extends SurfaceView implements Callback{
//用于控制SurfaceView
private SurfaceHolder sfh;
private Handler handler = new Handler();
private ImageRunnable imageRunnable = new ImageRunnable();
private Paint paint;
private Canvas canvas;
private Matrix matrix;

/**图片的坐标*/
private float imageX, imageY;
/**获取的图片*/
private Bitmap bmp;
/**图片宽高*/
private float bmpW, bmpH;
/**屏幕大小*/
private int screenW, screenH;

/**
* SurfaceView初始化函数
*/
public ImageSurfaceView(Context context, AttributeSet attrs) {
super(context, attrs);
sfh = this.getHolder();
sfh.addCallback(this);
paint = new Paint();
paint.setColor(Color.WHITE);
paint.setAntiAlias(true);
setFocusable(true);
}
/**
* SurfaceView视图创建,响应此函数
*/
@Override
public void surfaceCreated(SurfaceHolder holder) {
System.out.println("ImageSurfaceView is surfaceCreated");
screenH = this.getHeight();
screenW = this.getWidth();
handler.post(imageRunnable);
}
/**
* 游戏绘图
*/
public void draw() {
try {
canvas = sfh.lockCanvas();
canvas.drawRGB(0, 0, 0);
canvas.save();
//绘制
canvas.drawBitmap(bmp, matrix, paint);
System.out.println("绘制图像了吗?");
canvas.restore();
} catch (Exception e) {
e.printStackTrace();
} finally {
if (canvas != null)
sfh.unlockCanvasAndPost(canvas);
}
}
/**
* 触屏事件监听
*/
@Override
public boolean onTouchEvent(MotionEvent event) {
return true;
}

/**
* 图片的线程运行
*/
class ImageRunnable implements Runnable{
@Override
public void run() {
long start = System.currentTimeMillis();
draw();
long end = System.currentTimeMillis();
if (end - start 500) {
handler.postDelayed(this, 200 - (end-start));
}else{
handler.post(this);
}
}
}

/**
* SurfaceView视图状态发生改变,响应此函数
*/
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
System.out.println("ImageSurfaceView is surfaceChanged");
}
/**
* SurfaceView视图消亡时,响应此函数
*/
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
System.out.println("ImageSurfaceView is surfaceDestroyed");
}
}

layout的xml代码如下(使用方法,类的全地址做为控件名):
代码如下:

FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"


akai.test.getImage.ImageSurfaceView android:id="@+id/myImageView"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
/

LinearLayout android:id="@+id/buttons"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:background="@android:color/white"

Button android:id="@+id/getImage"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="选择图片"
/
Button android:id="@+id/getImage_ok"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="确定"
/
Button android:id="@+id/getImage_cancle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="取消"
/
/LinearLayout

/FrameLayout

以上代码为例子,仅供参考!
注意以下问题
1、本类的初始化函数需要加入参数,为:public ImageSurfaceView(Context context, AttributeSet attrs) ;
2、不要在初始化的时候获取screen的宽度和高度,在初始化的时候并还没有执行SurfaceCreated,所以获取宽度和高度要在surfaceCreated或者之后,且在surfaceDestroyed之前;
3、在显示本控件的时候,会执行surfaceCreated和surfaceChanged,当跳转到其他界面的时候则执行surfaceDestroyed(不管是否当前的activity已经销毁),所以如果在跳转回到次控件的时候立刻执行sfh.lockCanvas()的话将会获得空值Null。

来源:http://www.tulaoshi.com/n/20160219/1595569.html

延伸阅读
经研究,我推荐这种写法: 代码如下: SPAN xmlns="http://www.w3.org/1999/xhtml"/*自定义线程*/  class MyThread implements Runnable{   public void run() {    // TODO Auto-generated method stub  //  定义自己的变量            &nbs...
using System; using System.Windows.Forms; using System.Drawing; using System.Drawing.Drawing2D; using System.ComponentModel; namespace wzsbmain {  /// <summary  /// Summary description for LabelGradient.  /// </summary     public class wzsbmainLabel : System.Windows.Forms.Label &nbs...
在web开发中常常要使用js,为了提高效率一般都会制作js的类文件。这样在使用中更新复用都很方便。下面按照我工作中的一个案例,介绍如何定义js类文件制作自定义的控件。 一、设计需求 这个需求中,我们要制作一个,从webservice上获取一组学生成绩信息,然后在页面上按照及格与否显示出来。当然还要加上一些简单的互动效果。 按照MVC的设计,...
标签: Web开发
如何在DataGrid控件中实现自定义分页      在一般情况下,DataGrid控件每次实现翻页操作时,都会将数据源中的数据重新调用一次,当数据中 数据很多时,这样做就会很浪费系统资源和降低程序的执行效率.这时候我们一般通过自定义分页来解 决这个问题.     DataGrid控件的AllowCustomPaging属性用来...
标签: Delphi
  19.3.2 创建图形部件 图形控制是一类简单的部件。因为纯图形部件从不需要得到键盘焦点,所以它没有也不要窗口句柄。包含图形控制的应用程序用户仍然可以用鼠标操作控制,但没有键盘界面。 在本例中提供的图形部件是 TShape 。 Shape 部件位于 Component Palette 的 Additional 页。本例中的 Shape 部件有所...

经验教程

572

收藏

5
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部