android图像绘制(四)——SurfaceView问题,自定义控件

来源:互联网 发布:软件接口类型主要有 编辑:程序博客网 时间:2024/05/19 00:15

本文地址:http://blog.csdn.net/you_and_me12/article/details/7259759

自定义控件(类似按钮等)的使用,自定义一个SurfaceView。

如某一块的动态图(自定义相应),或者类似UC浏览器下面的工具栏

如下图示例:


自定义类代码:

public class ImageSurfaceView extends SurfaceView implements Callback{//用于控制SurfaceViewprivate 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视图创建,响应此函数 */@Overridepublic 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);}}/** * 触屏事件监听 */@Overridepublic boolean onTouchEvent(MotionEvent event) {return true;}/** * 图片的线程运行 */class ImageRunnable implements Runnable{@Overridepublic 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视图状态发生改变,响应此函数 */@Overridepublic void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {System.out.println("ImageSurfaceView is surfaceChanged");}/** * SurfaceView视图消亡时,响应此函数 */@Overridepublic 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。


原创粉丝点击