Android布局之SurfaceView与控件结合

转载 2015年07月08日 00:55:45

在做Android课程项目的过程中,因为涉及到了游戏画图与Android自带控件(如Button,TextView等)在一个Activity中的结合使用,故,这里介绍一下将二者结合为一的作法。 网上有很多前辈已经有了不少的总结,这里,我就拿自己实际做的东西来演示一下,希望各位莫见笑。

 

1.SurfaceView相关知识简介

根据Android官方网站(http://developer.android.com/reference/android/view/SurfaceView.html)的介绍,SurfaceView是继承与View,也就是我们在Click实践中常用到的view。它是在View层中,一个专门用户绘画的类。在绘画的时候,基本已定会用到的有以下几个工具类:Paint,画笔类;Cavans,画布类;(类似于Flex中的画布,用于承载其他的图画)。

另外,还需要着重介绍一个与其相关度甚高的接口(Interface):SurfaceHolder.CallBack。SurfaceHolser.CallBack提供了三个需要实现的接口:surfaceChanged,surfaceCreated,surfaceDestoryed。该接口控制着实现它的SurfaceView的生命周期,当surface建立的时候,调用surfaceCreated方法,结束时调用surfaceDestoryed方法。

 

2.SurfaceView与Android自带控件结合方式

问题来源: 问题最初的困惑是,对于每一个activity而言,都有自己的XML资源文件(形如R.layout.main)。而我最初是新建了一个InnerView,继承于SurfaceView,并实现SurfaceHolder.Callback, Runnable接口。 但是,问题也在这里。 因为只有通过setContentView()才能够将InnerView中的画面元素绑定到activity中,而这出现的问题是:activity自己资源文件中的控件就不能够注册到activity上面。

InnerView声明

public class InnerView extends SurfaceView implements STATICVALUE,
 SurfaceHolder.Callback, Runnable{....}

查阅了相关资料,找到了一种相对比较简便的解决方案:

使用FrameLayout。

 

3.具体解决步骤

a.首先,建立InnerView类,建议继承SurfaceView单独成为一个类,不要写到Activity中当做内部类。

b.然后,在main.xml中(假设activity对应的资源文件是main.xml),加入

    <FrameLayout  
       android:layout_width="fill_parent" 
       android:layout_height="wrap_content">  
       <com.chess.InnerView  
           android:id="@+id/innerView" 
            android:layout_width="fill_parent" 
            android:layout_height="fill_parent">  
       </com.chess.InnerView>  
    </FrameLayout>

修改成自己的SurfaceView

c.在activity类中,添加InnerView为成员变量,setContentView()保持原样即可,最后需要加上对InnerView的实例化。

private InnerView gameView = null;

。。。。。

setContentView(R.layout.main);
gameView = (InnerView)findViewById(R.id.innerView);

d.最重要的一点: InnerView的构造函数,需要使用

public InnerView(Context context, AttributeSet attrs){}

按照上面进行配置之后,便可以将Android自带控件和SurfaceView结合起来一起显示。

 

4.总结

总的来说,Android开发比较零碎,不是很系统。遇到问题大家多交流。 顺便贴一下结合之后的图像。上面的小喇叭和排行榜是ImageButton。

Android布局之SurfaceView与控件结合

视频学习之旅(一) SurfaceView控件--------------画面重叠问题

有一个这样的需求,下面有2个tab进行切换,第一个是录像界面(暂定为界面A),第二个是拍照界面(暂定为界面B),我第一个想到的就是用SurfaceView控件来实现,在布局文件里面它的属性很简单的。然...
  • qq_33756493
  • qq_33756493
  • 2017-03-20 17:14:18
  • 1010

Android视图SurfaceView的使用

Android视图SurfaceView的使用 绘制圆形进度条。
  • hehe26
  • hehe26
  • 2016-10-31 12:01:39
  • 3624

Framelayout布局之SurfaceView与控…

在做Android课程项目的过程中,因为涉及到了游戏画图与Android自带控件(如Button,TextView等)在一个Activity中的结合使用,故,这里介绍一下将二者结合为一的作法。 网上有...
  • zanshiyonghuming
  • zanshiyonghuming
  • 2016-02-26 17:00:46
  • 964

Android SurfaceView的绘制详解

在Android系统中,有一种特殊的视图,称为SurfaceView,它拥有独立的绘图表面,即它不与其宿主窗口共享同一个绘图表面。由于拥有独立的绘图表面,因此SurfaceView的UI就可以在一个独...
  • aa841538513
  • aa841538513
  • 2016-08-23 11:51:25
  • 7606

Android两个SurfaceView叠加显示

最近一段时间一直在做智能后视镜产品(Android平台)里的相机模块,目前已经告一段落了。现在空闲的时候可以把一些技术点记录下来。其中有一个需求就是显示前、后两个摄像头的预览画面,并且可以相互切换显示...
  • smileorcryps
  • smileorcryps
  • 2016-09-21 23:17:44
  • 5036

SurfaceView在layout配置时注意事项

在android的layout布局xml配置自定义的SurfaceView,如下示例:     android:layout_height="288dp"     android:id="@+...
  • leeafu
  • leeafu
  • 2012-10-18 10:56:50
  • 3019

Android视图SurfaceView的实现原理分析

在Android系统中,有一种特殊的视图,称为SurfaceView,它拥有独立的绘图表面,即它不与其宿主窗口共享同一个绘图表面。由于拥有独立的绘图表面,因此SurfaceView的UI就可以在一个独...
  • Luoshengyang
  • Luoshengyang
  • 2013-03-16 16:57:30
  • 204436

动态调整Android surfaceView 视图上下层问题

转载自: http://stackoverflow.com/questions/37385522/how-to-change-surfaceviews-z-order-runtime-in-andr...
  • qq_29461259
  • qq_29461259
  • 2016-11-03 11:03:17
  • 1671

解决SurfaceView设置透明造成覆盖其他组件的替代方案

之前在项目里面绘制摇杆圆盘使用SurfaceView来实现,同时设置SurfaceView透明,但是这样会造成SurfaceView的组件会覆盖其他的组件,一般情况没有关系,而不一般的情况就是有类似上...
  • jwzhangjie
  • jwzhangjie
  • 2013-07-25 20:08:49
  • 19677

Android--改变SurfaceView控件的大小

最近,被如何修改显示视频的SurfaceView控件大小(即视频播放时所看到的画面大小)搞得焦头烂额。查看了各种技术网站以及源码,终于找到了。 有两个tips需要注意: 视频的大小:即视频解码后原...
  • u011386173
  • u011386173
  • 2018-01-17 11:55:57
  • 452
收藏助手
不良信息举报
您举报文章:Android布局之SurfaceView与控件结合
举报原因:
原因补充:

(最多只允许输入30个字)