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

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

时间: 2024-07-28 15:31:51

android图像绘制(四)自定义一个SurfaceView控件的相关文章

自定义一个星形控件,但是空星不显示?

问题描述 这是web页面:<%@RegisterAssembly="ZiDingyiKJ"Namespace="ZiDingyiKJ"TagPrefix="cc"%><formid="form1"runat="server"><div><cc:StarID="stxing"Comment="MyCurControl-Star"

Android自定义播放器控件VideoView_Android

介绍 最近要使用播放器做一个简单的视频播放功能,开始学习VideoView,在横竖屏切换的时候碰到了点麻烦,不过在查阅资料后总算是解决了.在写VideoView播放视频时候定义控制的代码全写在Actvity里了,写完一看我靠代码好乱,于是就写了个自定义的播放器控件,支持指定大小,可以横竖屏切换,手动左右滑动快进快退.好了,下面开始. 效果图有点卡,我也不知道为啥..... VideoView介绍 这个是我们实现视频播放最主要的控件,详细的介绍大家百度就去看,这里介绍几个常用的方法. 用于播放视频

Android自定义播放器控件VideoView

介绍 最近要使用播放器做一个简单的视频播放功能,开始学习VideoView,在横竖屏切换的时候碰到了点麻烦,不过在查阅资料后总算是解决了.在写VideoView播放视频时候定义控制的代码全写在Actvity里了,写完一看我靠代码好乱,于是就写了个自定义的播放器控件,支持指定大小,可以横竖屏切换,手动左右滑动快进快退.好了,下面开始. 效果图有点卡,我也不知道为啥..... VideoView介绍 这个是我们实现视频播放最主要的控件,详细的介绍大家百度就去看,这里介绍几个常用的方法. 用于播放视频

Android自定义View之自定义评价打分控件RatingBar实现自定义星星大小和间距_Android

在Android开发中,我们经常会用到对商家或者商品的评价,运用星星进行打分.然而在Android系统中自带的打分控件,RatingBar特别不好用,间距和大小无法改变.所以,我就自定义了一个特别好用的打分控件.在项目中可以直接使用,特别简单.下面直接上图: 效果图 实现原理 其实就是自定义View继承LinearLayout ,然后里面动态加了五个ImageView. 实现代码,有详细的注释 在attrs中声明的可以在xml中设置的变量 <declare-styleable name="

图片-android 调用另一个界面控件报空求解

问题描述 android 调用另一个界面控件报空求解 我是隐藏一个控件,但是他却报空 解决方案 先打好基础吧,你确定构造了sideBar? 解决方案二: sideBar没有创建,你看看SortFragment中,什么时候创建的sideBar 解决方案三: sidebar都没new好不 解决方案四: sideBar没有创建吧! 解决方案五: 不要这样掉另一个界面啊,传值(或事件等方法)给那个界面,在那个界面去隐藏. 解决方案六: 控件没有被初始化,所以报空 解决方案七: sort.sideBar

Android自定义加载控件实现数据加载动画_Android

本文实例为大家分享了Android自定义加载控件,第一次小人跑动的加载效果眼前一亮,相比传统的PrograssBar高大上不止一点,于是走起,自定义了控件LoadingView去实现动态效果,可直接在xml中使用,具体实现如下 package com.*****.*****.widget; import android.content.Context; import android.graphics.drawable.AnimationDrawable; import android.util.

VB编写一个能显示百分比的自定义进度条控件

百分比|控件|显示 运行效果: 设计方法: 1.在UserControl中添加一个Label控件Label1,将它设为平面,用来做外框.添加两个PictureBox控件PictureBox1做为进度指示,PictureBox2控件做为控件背景. 2.加入以下代码 Option Explicit '定义私有变量用于存储属性值Private mvarMax As LongPrivate mvarMin As LongPrivate mvarValue As Long Private Rate As

Android拆轮子系列之写验证码控件的方法_Android

前言 先看看效果 怎么样不错吧?别急下面我就一步一步的教你实现. 用到的知识点总结: 1.Canvas和pint的使用,我们用它画点,线,字 2.View的基本用法 其实做这个东西还是很简单的,总体思路步骤如下: 1.准备一个Canvas. 2.向Canvas里面画几条斜杠. 3.向canvas里面画100个小点. 4.随机生成4个数字,然后画在canvas里面. 其实就是这么简单,没什么深奥的. 开始写编码 1.首先我们要重写View 既然我们要画验证码,那么我们就需要准备画笔(paint)和

Android拆轮子系列之写验证码控件的方法

前言 先看看效果 怎么样不错吧?别急下面我就一步一步的教你实现. 用到的知识点总结: 1.Canvas和pint的使用,我们用它画点,线,字 2.View的基本用法 其实做这个东西还是很简单的,总体思路步骤如下: 1.准备一个Canvas. 2.向Canvas里面画几条斜杠. 3.向canvas里面画100个小点. 4.随机生成4个数字,然后画在canvas里面. 其实就是这么简单,没什么深奥的. 开始写编码 1.首先我们要重写View 既然我们要画验证码,那么我们就需要准备画笔(paint)和