package eoe.Demo;

import android.app.Activity;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.MotionEvent;

public class Activity01 extends Activity {
GameSurfaceView mGameSurfaceView;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

//创建GameSurfaceView对象
mGameSurfaceView = new GameSurfaceView(this);

//设置显示GameSurfaceView视图
setContentView(mGameSurfaceView);
}

//触笔事件 返回值为true 父视图不做处理以下返回值为true的都是不做处理的
public boolean onTouchEvent(MotionEvent event){
return true;
}
//按键按下事件
public boolean onKeyDown(int keyCode, KeyEvent event){
return true;
}
//按键弹起事件
public boolean onKeyUp(int keyCode, KeyEvent event){
switch (keyCode) {
//上方向键
case KeyEvent.KEYCODE_DPAD_UP:
mGameSurfaceView.y-=3;
break;
//下方向键
case KeyEvent.KEYCODE_DPAD_DOWN:
mGameSurfaceView.y+=3;
break;
}
return false;
}
public boolean onKeyMultiple(int keyCode, int repeatCount, KeyEvent event){
return true;
}
}


写完这个例子 我有些疑问

可不可以 在 类似这种 SurfaceView 上边放一些控件呢?
前边已经说了Surface是提供给需要直接画像素而不是使用窗体部件的应用使用的。 但是 我还是想知道 为什么 不能再Surface上边放 一个控件 比如 一个 button 或者 一个 textview 这里我们来拿button 举例子 比如我们想在 Surface上边放一个 button 这时 我们就需要 new一个 button 按钮了呗 在Acvity01 类中我们可以这样做 Button button = new Button(this);
但是 你new 完这个 button 你怎么把它 放倒 SurfaceView 这个视图上呢? 因为在Activity01这个类中我们是这样设置布局的 setContentView(mGameSurfaceView); 它的布局就是一个 SurfaceView 说白了也是一个View 这就相当于在一个视图上在放一个视图
这是放不了的。
这时候有人就想了 我们可以把Button 放在 GameSurfaceView 类中 这个想法真是聪明 太聪明了。 然后我们就到 GameSurfaceView类中 这样写 Button button = new Button(this); 你会惊奇的发现他报错了 。 为什么呢? 下面我把 android 中 Button的源码贴上来大家看看


@RemoteView
public class Button extends TextView {
public Button(Context context) {
this(context, null);
}

public Button(Context context, AttributeSet attrs) {
this(context, attrs, com.android.internal.R.attr.buttonStyle);
}

public Button(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
}

Button 这个类比较简单 就三个构造方法。 但是 每个 构造方法 都需要一个 Context 对象。
这一点大家显然都已经注意到了。 那为什么 我可以再 在继承Activity的类里边 new一个Button 而在 继承 SurfaceView的类中确不行呢。
我们分别来看一下Activity类和GameSurfaceView类的继承关系


我想大家已经知道 为什么 SurfaceView 上边不可以放一些我们常用的控件了 也知道为什么我们可以再Activity类 里边可以 new Button 而在 SurfaceView 类里边却不行 因为我们的Activity类本身就是一个 Context对象。 而我们的 SurfaceView本身 不是 一个Context对象。 而我们要new 一个Button 怎么都得需要一个Context对象。从这个角度其实就可以解释为什么 我们不能再SurfaceView上边放一些我们常用的控件了 Button TextView之类的。

更多相关文章

  1. android >ToggleButton(开启/关闭) 控件
  2. Android动态设置控件高度
  3. [转]Android文字跑马灯控件
  4. Android(安卓)Intent传递对象和集合
  5. android实现Parcelable序列化对象
  6. android 自带的下拉刷新控件,含Demo(SwipeRefreshLayout控件)
  7. android 第一次运行应用的引导界面
  8. Android(安卓)View之组合控件实例(二)
  9. Android(安卓)Drawable

随机推荐

  1. Android 如何利用proc有上层想kernel写文
  2. Java中的ClassLoader 动态加载机制
  3. Android:自定义滚动边缘(EdgeEffect)效果
  4. Android四大布局及属性
  5. android使用traceView进行性能测试
  6. android:如果手机安装了app则打开一个acti
  7. Android 内存泄漏的检测和解决
  8. 石家庄android培训哪家实力强、就业率高?
  9. MIUI 系统 BUG,Android 调用相机崩溃?将拍
  10. Android硬件编解码与软件编解码