任何问题请联系WX:uu16853

买模板送网站采集器 让你轻松放开双手运营网站!

购买更多有优惠!

Android游戏开发之旅二 View和SurfaceView Android开发技术

  在Android游戏当中充当主要的除了控制类外就是显示类,在J2ME中我们用Display和Canvas来实现这些,而Google Android中涉及到显示的为view类,Android游戏开发中比较重要和复杂的就是显示和游戏逻辑的处理。这里我们说下android.view.View和android.view.SurfaceView。SurfaceView是从View基类中派生出来的显示类,直接子类有GLSurfaceView和VideoView,可以看出GL和视频播放以及Camera摄像头一般均使用SurfaceView,到底有哪些优势呢? SurfaceView可以控制表面的格式,比如大小,显示在屏幕中的位置,最关键是的提供了SurfaceHolder类,使用getHolder方法获取,相关的有Canvas  lockCanvas()  Canvas  lockCanvas(Rect dirty)  、void  removeCallback(SurfaceHolder.Callback callback)、void  unlockCanvasAndPost(Canvas canvas) 控制图形以及绘制,而在SurfaceHolder.Callback 接口回调中可以通过下面三个抽象类可以自己定义具体的实现,比如第一个更改格式和显示画面。 abstract void  surfaceChanged(SurfaceHolder holder, int format, int width, int height) abstract void  surfaceCreated(SurfaceHolder holder) abstract void  surfaceDestroyed(SurfaceHolder holder)   对于Surface相关的,Android底层还提供了GPU加速功能,所以一般实时性很强的应用中主要使用SurfaceView而不是直接从View构建,同时Android123未来后面说到的OpenGL中的GLSurfaceView也是从该类实现。 

Android游戏开发之旅三 View类详解 Android开发技术

  在Android游戏开发之旅二中我们讲到了View和SurfaceView的区别,今天Android123从View类开始着重的介绍Android图形显示基类的相关方法和注意点。   自定义View的常用方法:  onFinishInflate() 当View中所有的子控件均被映射成xml后触发 onMeasure(int, int) 确定所有子元素的大小 onLayout(boolean, int, int, int, int) 当View分配所有的子元素的大小和位置时触发 onSizeChanged(int, int, int, int) 当view的大小发生变化时触发 onDraw(Canvas) view渲染内容的细节 onKeyDown(int, KeyEvent) 有按键按下后触发 onKeyUp(int, KeyEvent) 有按键按下后弹起时触发 onTrackballEvent(MotionEvent) 轨迹球事件 onTouchEvent(MotionEvent) 触屏事件 onFocusChanged(boolean, int, Rect) 当View获取或失去焦点时触发  onWindowFocusChanged(boolean) 当窗口包含的view获取或失去焦点时触发 onAttachedToWindow() 当view被附着到一个窗口时触发 onDetachedFromWindow() 当view离开附着的窗口时触发,Android123提示该方法和  onAttachedToWindow() 是相反的。 onWindowVisibilityChanged(int) 当窗口中包含的可见的view发生变化时触发   以上是View实现的一些基本接口的回调方法,一般我们需要处理画布的显示时,重写onDraw(Canvas)用的的是最多的:   @Override   protected void onDraw(Canvas canvas) {    //这里我们直接使用canvas对象处理当前的画布,比如说使用Paint来选择要填充的颜色    […]

Android游戏开发之旅11 View中手势识别 Android开发技术

   有关Android平台的游戏开发中我们需要涉及到控制,在开始的Android游戏开发之旅中我们提到了按键和轨迹球的控制方式,从今天开始Android123开始给出大家游戏中其他的一些控制方式,比如今天的手势操作和未来重力感应。   很多网友发现Android中手势识别提供了两个类,由于Android 1.6以下的版本比如cupcake中无法使用android.view.GestureDetector,而android.gesture.Gesture是Android 1.6才开始支持的,我们考虑到仍然有很多Android 1.5固件的网友,就来看下兼容性更强的android.view.GestureDetector。在android.view.GestureDetector类中有很多种重载版本,下面我们仅提到能够自定义在View中的两种方法,分别为GestureDetector(Context context, GestureDetector.OnGestureListener listener) 和 GestureDetector(Context context, GestureDetector.OnGestureListener listener, Handler handler) 和。我们可以看到第一个参数为Context,所以我们想附着到某View时,最简单的方法就是直接从超类派生传递Context,实现GestureDetector里中提供一些接口。   下面我们就以实现手势识别的onFling动作,在CwjView中我们从View类继承,当然大家可以从TextView等更高层的界面中实现触控。 class CwjView extends View {     private GestureDetector mGD;    public CwjView(Context context, AttributeSet attrs) {        super(context, attrs);              mGD = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener() {                public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {                    int […]

Android屏幕截图之View方法 Android开发技术

  很多网友可能发现Android并没有提供屏幕截图ScreenShot的方法,了解Linux的网友可能知道直接读取/dev/graphics/fb0即可来实现framebuffer,当然了对于自己的View实现一些绘图或子类化的技术时可以不用系统级这样的方法,我们可以通过 view.setDrawingCacheEnabled(true); //其中View是你需要截图的的View Bitmap bm = view.getDrawingCache(); 

Android平台View的按键事件KeyDown用法 Android开发技术

  我们继续讨论下Android游戏开发的一些前置知识,平时设计自己的显示类View时需要捕获按键事件,比如KeyEvent、首先引入android.view.KeyEvent类,直接重写onKeyDown方法,同样在键盘上每个按钮都对应一个Scancode扫描吗,详细的定义在KeyEvent类中有,直接查看Android SDK中的定义,实现的方法如下: public boolean onKeyDown(int keyCode, KeyEvent msg) {     if (keyCode == KeyEvent.KEYCODE_DPAD_CENTER) {           // 按下中键时触发的事件,这里android123.com.cn提醒网友G1或ADP1使用的是轨迹球,这个Trackball仍然可以按下的,不仅仅是方向的导航。             return (true);     }        if (keyCode == KeyEvent.KEYCODE_DPAD_LEFT) {         //向左            return (true);        }        if (keyCode == KeyEvent.KEYCODE_DPAD_RIGHT) {         //向右            return (true);        }        if(keyCode == KeyEvent.KEYCODE_DPAD_UP){         //向上            return (true);        }        if(keyCode == KeyEvent.KEYCODE_DPAD_DOWN){         //向下            return (true);        }        return super.onKeyDown(keyCode, msg);    } […]

Only the original thread that created a view hierarchy can touch its views的相关 Android开发技术

  很多网友在Android中使用多线程处理UI相关内容时可能会发现Logcat提示Only the original thread that created a view hierarchy can touch its views这样的错误,这主要是Android的相关View和控件不是线程安全的,我们必须做独立的处理这点比J2ME麻烦一些,这里Android给我们提供了很多方法,有关线程的,我们需要了解下J2ME中一些传统的线程创建方法,比如Runnable或直接new Thread(),大家需要了解UI线程、worker线程以及一些概念。今天android开发网说一种简单的方法除了异步任务AsyncTask外使用Handler可以很好的处理,和Win32的消息很像。   首先我们需要明白,主线程或者这里说的原始线程original thread 一般情况下是UI线程,当然UI线程并不一定是主线程,我们不能长时间的阻塞该应用,在Android平台上可能会产生类似Force close或Wait这样的对话框这里我们成为ANR,这里除了使用ProgressDialog方式给用一个动态的进度代表当前处理并没有中断可能需要一些时间,所以android123告诉大家相关的网络处理可以使用工作者线程,但是worker 线程不能处理显示元素即UI相关的View或Widget包中的高层的控件,所以通过一个Handler对象可以很好的传递Runnable或Message ,下面我们用一个简单的例子来描述   final Handler cwjHandler = new Handler();    final Runnable mUpdateResults = new Runnable() {        public void run() {            updateUI();        }    };     @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);      NetworkOperation();//一个很费时间的I/O操作,比如网络或文件读写等等。       } […]

Android UI开发专题(四) View自绘控件 Android开发技术

  很多时候想要设计漂亮的Android UI,使用Android自带的控件无法满足我们的需要就要考虑自绘控件,在Android界面显示类View,可以通过继承扩展重写相关方法来实现我们的图形绘制。   首先我们需要了解下View类的底层实现,在SDK中我们可以看到View直接继承于Java的基类Object,实现了图形绘制和按键事件Drawable.Callback KeyEvent.Callback的相关方法,我们自绘时主要实现其内部的onDraw方法,相关的界面计算可以重写onMeasure方法,对于相关的按键可以重载onKeyDown、onKeyUp以及onTouchEvent等,下面android开发网就以一个实例来表示。 public class cwjView extendsView{  public cwjView(Context context)  {     this(context,null);  }   public cwjView(Context context,AttributeSet attrs)  {     this(context,attrs,0);  }   public cwjView(Context context,AttributeSet attrs,int defStyle)  {     super(context,attrs,defStyle);     //这里是本类的构造,相关初始化可以在这里添加代码   }  @Override  protectd void onDraw(Canvas canvas)  {     super(canvas);      //绘图的关键,可以看到已经包含了一个canvas句柄,可以直接通过我们前面讲到的Canvas类进行相关的操作,完整的例子,大家可以参考Android SDK中例子Snake贪食蛇游戏的实现。   } }  有关View类的更新,我们直接通过调用invalidate(int l,int r,int r,int b)来更新一个Rect矩形区域,或更新全部,同时在线程中我们使用需要调用postInvalidate来更新界面。 

Android自定义View实例AnalogClock源码 Android开发技术

  针对Android底层View的直接构造很多网友没有实战经验,本次Android开发网结合目前平台开源代码一起通过AnalogClock类来理解View的直接继承。AnalogClock就是Home Screen上的那个带有两根指针的表盘类。它的实现我们直接从开源代码可以了解到:   public class AnalogClock extends View {    private Time mCalendar;     private Drawable mHourHand; //时针    private Drawable mMinuteHand; //分针    private Drawable mDial; //表盘背景     private int mDialWidth; //表盘宽度    private int mDialHeight; //表盘高度     private boolean mAttached; //附着状态     private final Handler mHandler = new Handler(); //定一个Handler类实现更新时间    private float mMinutes;    private float mHour;    private boolean mChanged; […]

100% Secure Checkout

PayPal / MasterCard / Visa