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

杜晶晶大好人°

杜晶晶大好人°

2016-02-19 10:43

今天图老师小编要向大家分享个android图像绘制(四)自定义一个SurfaceView控件教程,过程简单易学,相信聪明的你一定能轻松get!
自定义控件(类似按钮等)的使用,自定义一个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。
展开更多 50%)
分享

猜你喜欢

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

编程语言 网络编程
android图像绘制(四)自定义一个SurfaceView控件

自定义 CRichEditCtrl 控件

C语言教程 C语言函数
自定义 CRichEditCtrl 控件

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

android dialog自定义实例详解

编程语言 网络编程
android dialog自定义实例详解

VC中自定义CRichEditCtrl控件

编程语言 网络编程
VC中自定义CRichEditCtrl控件

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

GridView控件自定义分页详解

Web开发
GridView控件自定义分页详解

自定义控件(可以动态加载用户控件)

电脑网络
自定义控件(可以动态加载用户控件)

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

在 SQLSERVER 中快速有条件删除海量数据

在 SQLSERVER 中快速有条件删除海量数据

动态增加/删除文件域

动态增加/删除文件域
下拉加载更多内容 ↓