自定义控件(类似按钮等)的使用,自定义一个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。