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。
- android图像绘制(四)——SurfaceView问题,自定义控件
- android图像绘制(一)——镜像问题
- android图像绘制(二)——放缩问题
- Android自定义控件——自定义View绘制钟表
- android 绘制自定义控件
- android 绘制自定义控件
- Android控件架构与自定义控件详解(一)——Android控件架构与View的绘制原理
- Android 绘制rotate控件/图像
- android 自定义轮播广告控件ViewPager——自定义控件学习(四)
- Android自定义控件--波浪球SurfaceView实现
- Android自定义控件之SurfaceView的使用
- 自定义控件学习笔记(四)文字的绘制
- android 自定义控件(四)自定义进度条
- 【自定义控件系列四】android绘制实战(一)通过Canvas+Path+Paint组合绘制图表
- Android自定义控件之——文字圆形边框(将文字绘制在圆中间)
- Android自定义控件之——文字圆形边框(将文字绘制在圆中间)
- android图像绘制(三)——画布刷屏问题
- Android控件架构与自定义控件详解(四)——事件拦截机制分析
- 隨機抽樣一致性算法(RANSAC)
- 基于axure的PRD协作
- O2O模式:移动化电子商务未来
- 浅谈产品竞争分析的方法
- C#隐藏关键字 结构体的反射
- android图像绘制(四)——SurfaceView问题,自定义控件
- OpenCV(EmguCV)2.1新特性介紹之圖像差異StereoSGBM與設置窗口屬性SetWindowProperty(StereoSGBM Of OpenCV 2.1)
- C++反汇编五(DO...WHILE语句)
- C++反汇编六(WHILE...DO语句)
- 今天赚了两美元
- Callback Functions in JavaScript
- C++反汇编七(FOR语句)
- C++网络编程--TCP服务器端
- note: raw socket