源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

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

  • 时间:2020-10-26 01:55 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:android图像绘制(四)自定义一个SurfaceView控件
自定义控件(类似按钮等)的使用,自定义一个SurfaceView。 如某一块的动态图(自定义相应),或者类似UC浏览器下面的工具栏。 [b]如下图示例[/b]: [img]http://files.jb51.net/file_images/article/201301/2013117102025798.jpg?201301710211[/img]   [b]自定义类代码[/b]:
[u]复制代码[/u] 代码如下:
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代码如下(使用方法,类的全地址做为控件名):
[u]复制代码[/u] 代码如下:
<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>
以上代码为例子,仅供参考! [b]注意以下问题[/b]: 1、本类的初始化函数需要加入参数,为:public ImageSurfaceView(Context context, AttributeSet attrs) ; 2、不要在初始化的时候获取screen的宽度和高度,在初始化的时候并还没有执行SurfaceCreated,所以获取宽度和高度要在surfaceCreated或者之后,且在surfaceDestroyed之前; 3、在显示本控件的时候,会执行surfaceCreated和surfaceChanged,当跳转到其他界面的时候则执行surfaceDestroyed(不管是否当前的activity已经销毁),所以如果在跳转回到次控件的时候立刻执行sfh.lockCanvas()的话将会获得空值Null。
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部