SurfaceView与控件结合
2014-06-28 11:35
190 查看
在做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。
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。
相关文章推荐
- 使用surfaceView结合贝塞尔曲线生成波形动态控件
- Android布局之SurfaceView与控件结合
- 播放视频android学习笔记---44_在线视频播放器,网络视频解析器,SurfaceView 控件使用方法
- 在SurfaceView中添加系统控件,并且相互交互数据!
- android中的surfaceview控件
- Android控件-SurfaceView
- Android TextView与html的结合使用 一个控件显示多种文字
- xml用到surfaceview控件 遇到unable to start activity componentInfo类问题
- Android高级控件(二)——SurfaceView实现GIF动画架包,播放GIF动画,自己实现功能的初体现
- Android 下拉刷新控件SwipeRefreshLayout结合WebView使用
- Android控件学习(四):ViewPager和TabHost结合Java代码
- 自己定义控件(2.2):SurfaceView和SurfaceHolder
- android SurfaceView 使用示例 why SurfaceView上 不可以用控件的轻微解释
- SurfaceView与Canvas的结合实现简单的图形绘制与动画效果
- android tabhost下嵌套两个activity(不妨设A和B),其中B包含SurfaceView控件,A可以跳转到C(也是Activity),B会对C的生命周期有奇怪的影响,从何解决?
- surfaceView中添加控件
- android学习笔记---44_在线视频播放器,网络视频解析器,SurfaceView 控件使用方法
- 【Android游戏开发之六】在SurfaceView中添加系统控件,并且相互交互数据!
- 多媒体之播放视频——VideoView和MediaPlayer(MediaPlayer和SurfaceView结合)
- Android高级控件(二)——SurfaceView实现GIF动画架包,播放GIF动画,自己实现功能的初体现