任何问题请联系WX:uu16853

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

购买更多有优惠!

Android游戏开发之旅一 长按Button原理 Android开发技术

  今天Android123开始新的Android游戏开发之旅系列,主要从控制方法(按键、轨迹球、触屏、重力感应、摄像头、话筒气流、光线亮度)、图形View(高效绘图技术如双缓冲)、音效(游戏音乐)以及最后的OpenGL ES(Java层)和NDK的OpenGL和J2ME游戏移植到Android方法,当然还有一些游戏实现惯用方法,比如地图编辑器,在Android OpenGL如何使用MD2文件,个部分讲述下Android游戏开发的过程最终实现一个比较完整的游戏引擎。相信大家都清楚Android Market下载量比较好的都是游戏,未来手机网游的发展相信Android使用的Java在这方面有比iPhone有更低的入门门槛。   对于很多游戏使用屏幕控制一般需要考虑长按事件,比如在动作类的游戏中需要长按发射武器,结合Android Button模型,我们实现一个带图片的Button的长按,为了更清晰的显示原理,Android开发网这里使用ImageButton作为基类   public class RepeatingImageButton extends ImageButton {     private long mStartTime; //记录长按开始    private int mRepeatCount; //重复次数计数    private RepeatListener mListener;    private long mInterval = 500; //Timer触发间隔,即每0.5秒算一次按下        public RepeatingImageButton(Context context) {        this(context, null);    }     public RepeatingImageButton(Context context, AttributeSet attrs) {        this(context, attrs, android.R.attr.imageButtonStyle);    }     public RepeatingImageButton(Context context, […]

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游戏开发之旅四 Canvas和Paint实例 Android开发技术

  昨天我们在Android游戏开发之旅三 View详解中提到了onDraw方法,有关详细的实现我们今天主要说下Android的Canvas和Paint对象的使用实例。   Canvas类主要实现了屏幕的绘制过程,其中包含了很多实用的方法,比如绘制一条路径、区域、贴图、画点、画线、渲染文本,下面是Canvas类常用的方法,当然Android开发网提示大家很多方法有不同的重载版本,参数更灵活。   void drawRect(RectF rect, Paint paint) //绘制区域,参数一为RectF一个区域   void drawPath(Path path, Paint paint) //绘制一个路径,参数一为Path路径对象    void  drawBitmap(Bitmap bitmap, Rect src, Rect dst, Paint paint)   //贴图,参数一就是我们常规的Bitmap对象,参数二是源区域(Android123提示这里是bitmap),参数三是目标区域(应该在canvas的位置和大小),参数四是Paint画刷对象,因为用到了缩放和拉伸的可能,当原始Rect不等于目标Rect时性能将会有大幅损失。    void  drawLine(float startX, float startY, float stopX, float stopY, Paint paint)  //画线,参数一起始点的x轴位置,参数二起始点的y轴位置,参数三终点的x轴水平位置,参数四y轴垂直位置,最后一个参数为Paint画刷对象。   void  drawPoint(float x, float y, Paint paint) //画点,参数一水平x轴,参数二垂直y轴,第三个参数为Paint对象。   void drawText(String text, […]

Android游戏开发之旅五 Path和Typeface Android开发技术

   今天我们继续处理上次 Android游戏开发之旅四 Canvas和Paint实例 中提到的Path路径和Typeface字体两个类。对于Android游戏开发或者说2D绘图中来讲Path路径可以用强大这个词来形容。在Photoshop中我们可能还记得使用钢笔工具绘制路径的方法。Path路径类在位于android.graphics.Path中,Path的构造方法比较简单,如下    Path cwj=new Path();  //构造方法    下面我们画一个封闭的原型路径,我们使用Path类的addCircle方法    cwj.addCircle(10,10,50,Direction.CW); //参数一为x轴水平位置,参数二为y轴垂直位置,第三个参数为圆形的半径,最后是绘制的方向,CW为顺时针方向,而CCW是逆时针方向。     结合Android上次提到的Canvas类中的绘制方法drawPath和drawTextOnPath,我们继续可以在onDraw中加入。    canvas.drawPath(cwj,paintPath); //Android123提示大家这里paintPath为路径的画刷颜色,可以见下文完整的源代码。    canvas.drawTextOnPath("Android123 – CWJ",cwj,0,15,paintText); //将文字绘制到路径中去,有关drawTextOnPath的参数如下:    方法原型public void drawTextOnPath (String text, Path path, float hOffset, float vOffset, Paint paint)    参数列表 text  为需要在路径上绘制的文字内容。 path 将文字绘制到哪个路径。  hOffset   距离路径开始的距离vOffset   离路径的上下高度,这里Android开发网提示大家,该参数类型为float浮点型,除了精度为8位小数外,可以为正或负,当为正时文字在路径的圈里面,为负时在路径的圈外面。 paint  最后仍然是一个Paint对象用于制定Text本文的颜色、字体、大小等属性。   下面是我们的onDraw方法中如何绘制路径的演示代码为:    @Override   protected void onDraw(Canvas canvas) […]

Android游戏开发之旅六 自定义View Android开发技术

  有关Android的自定义View的框架今天我们一起讨论下,对于常规的游戏,我们在View中需要处理以下几种问题: 1.控制事件 2.刷新View 3. 绘制View   1. 对于控制事件今天我们只处理按键事件onKeyDown,以后的文章中将会讲到屏幕触控的具体处理onTouchEvent以及Sensor重力感应等方法。   2. 刷新view的方法这里主要有invalidate(int l, int t, int r, int b) 刷新局部,四个参数分别为左、上、右、下。整个view刷新 invalidate(),刷新一个矩形区域 invalidate(Rect dirty) ,刷新一个特性Drawable, invalidateDrawable(Drawable drawable) ,执行invalidate类的方法将会设置view为无效,最终导致onDraw方法被重新调用。由于今天的view比较简单,Android123提示大家如果在线程中刷新,除了使用handler方式外,可以在Thread中直接使用postInvalidate方法来实现。   3. 绘制View主要是onDraw()中通过形参canvas来处理,相关的绘制主要有drawRect、drawLine、drawPath等等。view方法内部还重写了很多接口,其回调方法可以帮助我们判断出view的位置和大小,比如onMeasure(int, int) Called to determine the size requirements for this view and all of its children.  、onLayout(boolean, int, int, int, int) Called when this view should assign […]

Android游戏开发之旅七 自定义SurfaceView Android开发技术

  今天我们说下未来的Android游戏引擎模板架构问题,对于游戏我们还是选择SurfaceView,相关的原因Android123已经在Android游戏开发之旅二 View和SurfaceView中说的很清楚了,这里我们直接继承SurfaceView,实现SurfaceHolder.Callback接口,处理surfaceCreated、surfaceChanged以及surfaceDestroyed方法,这里我们并没有把按键控制传入,最终游戏的控制方面仍然由View内部类处理比较好,有关SurfaceView的具体我们可以参见Android开源项目的Camera中有关画面捕捉以及VideoView的控件实现大家可以清晰了解最终的用意。 public class cwjView extends SurfaceView implements SurfaceHolder.Callback {   public cwjView(Context context, AttributeSet attrs) {  super(context, attrs);  SurfaceHolder holder=getHolder();  holder.addCallback(this);       setFocusable(true); }  public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {      }  public void surfaceCreated(SurfaceHolder holder) {     }  public void surfaceDestroyed(SurfaceHolder holder) {      }  @Override public void onWindowFocusChanged(boolean hasWindowFocus) {   }    }

Android游戏开发之旅八 SurfaceView类实例 Android开发技术

  有关SurfaceView我们将通过三个系统自带的例子来深入掌握Android绘图必会的SurfaceView,今天我们以SDK中的Sample游戏lunarlander中的LunarView具体实现,Android123建议大家导入该游戏工程到你的Eclipse然后自己编译先玩一下这个游戏,然后再看代码比较好理解。 class LunarView extends SurfaceView implements SurfaceHolder.Callback {    class LunarThread extends Thread {        /*         * Difficulty setting constants         */        public static final int DIFFICULTY_EASY = 0;        public static final int DIFFICULTY_HARD = 1;        public static final int DIFFICULTY_MEDIUM = 2;        /*         * Physics constants         */        public static final int PHYS_DOWN_ACCEL_SEC = 35;        public static […]

Android游戏开发之旅九 VideoView类剖析 Android开发技术

   有关SurfaceView相关的内容今天Android123继续延用系统的示例类VideoView来让大家深入了解Android平台的图形绘制基础类的实现原理。大家可能会发现VideoView类的控制方面无法改变,我们可以通过重构VideoView类来实现更个性化的播放器。     public class VideoView extends SurfaceView implements MediaPlayerControl {    private String TAG = "VideoView";    // settable by the client    private Uri         mUri;    private int         mDuration;     // all possible internal states    private static final int STATE_ERROR              = -1;    private static final int STATE_IDLE               = 0;    private static final int STATE_PREPARING          = 1;    private […]

Android游戏开发之旅十 位图旋转 Android开发技术

  今天有关Android游戏开发的基础,我们说下Bitmap相关的实用操作,这里我们就说下位图旋转。在Android中图形的旋转和变化提供了方便的矩阵Maxtrix类,Maxtrix类的setRotate方法接受图形的变换角度和缩放,最终Bitmap类的createBitmap方法中其中的重载函数,可以接受Maxtrix对象,方法原型如下   public static Bitmap createBitmap (Bitmap source, int x, int y, int width, int height, Matrix m, boolean filter)  参数的具体意思source 源bitmap对象x  源坐标x位置y 源坐标y位置width  宽度height  高度 m  接受的maxtrix对象,如果没有可以设置为nullfilter 该参数仅对maxtrix包含了超过一个翻转才有效。   下面Android123给大家一个比较经典的例子,rotate方法是静态方法可以直接调用,参数为源Bitmap对象,参数二为旋转的角度,从0~360,返回值为新的Bitmap对象。其中具体的宽高可以调整。   public static Bitmap rotate(Bitmap b, int degrees) {        if (degrees != 0 && b != null) {            Matrix m = new Matrix();            m.setRotate(degrees,                    (float) b.getWidth() / 2, […]

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游戏开发之旅12 Sensor重力感应 Android开发技术

  从Android手机开始,主流的智能机纷纷加入了感应器Sensor硬件,常见的有光线感应器、重力感应器、加速感应器,而更高级的有磁极方向、陀螺仪、距离感应器、温度感应器等等。对于Android游戏开发,我们主要用到重力、加速、磁力和陀螺仪四种,当然部分游戏可能需要GPS或Cellid定位来修正一些位移信息。从系统中提高的感应器主要在android.hardware中,我们可以看到系统提供了android.hardware.SensorEventListener、Sensor和SensorManager这三个类,我们会发现除了可以获取感应器的信息,和感应器的原始数据外,并没有提供相关的逻辑处理。Android123将会分3篇来详细的介绍不同感应器的作用和逻辑处理,比如自由落体,晃动,磁极,当前的旋转速度。    未来Android123将完成主要是一个基于OpenGL 3D的雷电游戏,最终加入联网对战效果可以团队打怪实现手机3D网游充分发挥Android手机的娱乐能力。对于大多数新款Android手机可能没有配备轨迹球或导航键的方向控制,所以重力感应器是这类实时性较强游戏的首选控制方式。主要有以下几点问题对于Sensor   1. 降噪处理,如果做过LBS软件的大家可能明白偏移修正,在GPS无法正常获取数据较间断时地图不能乱飘,这里Sensor也不例外,除了使用采样数据平均值获取外,可以间隔采样的方法来处理。细节的算法我们将在下节给出示例代码。   2. 感应器的敏感度,在Android中提供了四种延迟级别分别为 SENSOR_DELAY_FASTEST 最低延迟,一般不是特别敏感的处理不推荐使用,该种模式可能造成手机电力大量消耗,由于传递的为原始数据,算法不处理好将会影响游戏逻辑和UI的性能,所以Android开发网不推荐大家使用。SENSOR_DELAY_GAME 游戏延迟,一般绝大多数的实时性较高的游戏都使用该级别  int SENSOR_DELAY_NORMAL 标准延迟,对于一般的益智类或EASY级别的游戏可以使用,但过低的采样率可能对一些赛车类游戏有跳帧现象。int SENSOR_DELAY_UI 用户界面延迟,一般对于屏幕方向自动旋转使用,相对节省电能和逻辑处理,一般游戏开发中我们不使用。  

Android游戏开发之旅13 Sensor感应示例 Android开发技术

  有关Android游戏开发中的Sensor感应示例今天我们将一起来讨论,对于目前最新的Android 2.2平台而言仍然没有具体的感应判断逻辑,下面我们一起定义下常用的感应动作事件。首先Android123提醒大家由于是三轴的立体空间感应所以相对于轨迹球、导航键的上下左右外,还提供了前后的感应,所以我们定义最基本的六种空间方向。  public static final int CWJ_UP = 0; public static final int CWJ_DOWN = 1; public static final int CWJ_LEFT = 2; public static final int CWJ_RIGHT = 4; public static final int CWJ_FORWARD = 8; //向前 public static final int CWJ_BACKWARD = 16; //向后   下面我们做精确的角度旋转修正值定义,我们用到yaw、pitch和roll,相信学过3D开发的网友不会对这些陌生的,我们就把他们对应为绕y、x、z轴的角度好了,如果你们没有学过3D相关的知识这里Android开发网推荐大家可以通过Cube例子自定义Render来观察这三个值对应立方体的旋转角度。 Yaw在(0,0,0)中, 以xOz的坐标平面中围绕y轴旋转,如果是负角则我们定义为CWJ_YAW_LEFT 即往左边倾斜,同理我们定义如下:  public static final int CWJ_YAW_LEFT = 0; public static […]

Android应用数本月将超过10万个 Android开发技术

  本月Android Market上的应用数量将超过10万个,赶超Apple App Store的日期屈指可数,但是在一年前Android Market的软件数量还不到1w个面对这样的发展速度,我们可以想象对于Android手机推动做出的巨大作用,很多人喜欢iPhone的原因除了高品质的硬件外,超酷的软件也是其中原因之一。   目前Android Market上比较缺少质量较高的游戏,比如Gameloft的游戏基本上可以用粗糙来形容,相对于在Market之外销售的EA公司的Android游戏而言有很大的差距,同时移动互联网未来的金矿将会转移到手机网游身上,诞生下一个盛大或者说史玉柱这样的公司或一夜成名的人才来说这是一个很好的机会。

Android游戏开发之旅14 游戏开发实战一 Android开发技术

  从今天开始Android123将开始带领大家进入Android游戏开发实战篇,本次我们首个游戏为2D的基于SurfaceView的类似横版卷轴游戏。第一天我们说下需要做哪些准备:   一、游戏地图编辑器,在J2ME时代我们可能都是用GIF分割多帧或BMP上放置多个图片通过减少文件头来压缩体积,但是在Android平台上开发游戏我们不需要那么节省,不过资源的释放仍然很重要,否则会出现OutOfMemoryError这样的悲剧发生。一般简单的2D平面游戏地图都是使用二维数组来标记的。我们可以想象矩阵中的每个元素对应每个图片资源。详细的存储方法我们将在下次具体讲到。   二、控制方式,由于横版过关类游戏不适合重力感应操作,我们这里选择屏幕下方加设一个区域,放置上、下、左、右按键,同时右侧给出常用的攻击、跳跃按钮,而游戏的暂停可以通过触控实现继续或暂停。   三、音效处理,常规的一般在攻击比如出拳、发射子弹的过程中有音效,或对手自己中弹(当然对于Android图形开发来说就是碰撞检测)时发出音效,跳跃、过关均会需要一些声音素材文件,一般的游戏还需要背景音乐配合烘托游戏气氛。   四、游戏逻辑,这是主要的地方,我们将通过实例代码让大家了解游戏开发中是如何的卷轴、人物的跳跃、攻击有效判断即碰撞检测,电脑智能等算法问题。   五、细节处理,比如计分,等级,游戏计时,关卡档案的存档,读取以及开场设计,关卡过渡的过场动画处理。   这里Android开发网提示大家,目前很多J2ME的游戏可以轻松的移植到Android平台,主要的细节只要了解Google Android平台的图形相关问题即可,主要是Bitmap、Drawable和View线程处理问题。

Android游戏开发之旅15 按键中断处理 Android开发技术

 有关Android平台上游戏开发中我们需要处理一些特别的按键事件,对于突发的事情我们需要特别的考虑,比如突然来电话了和游戏中按下一些特殊的键,比如拍照键  @Override    public boolean dispatchKeyEvent(KeyEvent event)    {           switch (event.getKeyCode())           {             case KeyEvent.KEYCODE_VOLUME_UP:   //音量键+             case KeyEvent.KEYCODE_VOLUME_DOWN:   //音量键-             case KeyEvent.KEYCODE_CAMERA:  //拍照键             case KeyEvent.KEYCODE_FOCUS:   //拍照键半按的对焦状态          //   event.getAction() == KeyEvent.ACTION_UP   //Android123提示如果按键按下后弹起时触发                           }                return true; //这些标记为处理过,则不在往内部传递         default:                break;        }        return super.dispatchKeyEvent(event);    }   对于游戏突然来电话我们一般采取通过PhoneStateListener类提供的public void onCallStateChanged (int state, String incomingNumber) 回调方法可以获取电话的状态,比如常规空闲时CALL_STATE_IDLE、来电时CALL_STATE_RINGING和CALL_STATE_OFFHOOK 摘机通话中,有关处理的细节网友可以查看Android Git项目中的Music,在Android开源项目中系统自带的音乐播放器可以很好的处理,比如在通话结束后恢复音乐播放,而我们游戏需要做的就是记住当前的游戏状态尽量数据持久化处理,不能因为长时间的通话,游戏的Activity被清理了,这里我们一般通过onSaveInstanceState来保存当前窗口的一些记录,通过Intent标记来让系统管理好我们游戏的生命周期。

Android游戏开发之旅16 异步音乐播放 Android开发技术

  在Android游戏开发中我们必须考虑背景音乐播放问题,在Android平台中提供了MediaPlayer类可以播放声音,但是游戏除了播放音乐外还需要考虑画面的流畅性,以及多种音效同时播放,所以必须用到Android多线程机制和异步音效播放。Android SDK从1.0开始就提供了AsyncPlayer类,这里我们为了根据我们自己的需要可以派生或修改出更灵活的播放类。 import android.content.Context;import android.net.Uri;import android.os.PowerManager;import android.os.SystemClock;import android.util.Log; import java.io.IOException;import java.lang.IllegalStateException;import java.util.LinkedList;  public class AsyncPlayer {    private static final int PLAY = 1;    private static final int STOP = 2;    private static final boolean mDebug = false;     private static final class Command {        int code;        Context context;        Uri uri;        boolean looping;        int stream;        […]

Android游戏开发之旅17 图像渐变特效 Android开发技术

   在Android游戏开发中我们不免要涉及到一些图形特效处理,今天主要看下Android平台下实现渐变效果。在android.graphics中我们可以找到有关Gradient字样的类,比如LinearGradient 线性渐变、RadialGradient径向渐变和 角度渐变SweepGradient 三种,他们的基类为android.graphics.Shader。为了显示出效果android123使用一个简单的例子来说明。   一、LinearGradient线性渐变   在android平台中提供了两种重载方式来实例化该类分别为,他们的不同之处为参数中第一种方法可以用颜色数组,和位置来实现更细腻的过渡效果,比如颜色采样int[] colors数组中存放20种颜色,则渐变将会逐一处理。而第二种方法参数仅为起初颜色color0和最终颜色color1。 LinearGradient(float x0, float y0, float x1, float y1, int[] colors, float[] positions, Shader.TileMode tile) LinearGradient(float x0, float y0, float x1, float y1, int color0, int color1, Shader.TileMode tile)    使用实例如下   Paint p=new Paint();   LinearGradient lg=new LinearGradient(0,0,100,100,Color.RED,Color.BLUE,Shader.TileMode.MIRROR);  //参数一为渐变起初点坐标x位置,参数二为y轴位置,参数三和四分辨对应渐变终点,最后参数为平铺方式,这里设置为镜像   刚才Android开发网已经讲到Gradient是基于Shader类,所以我们通过Paint的setShader方法来设置这个渐变,代码如下:   p.setShader(lg);   canvas.drawCicle(0,0,200,p); //参数3为画圆的半径,类型为float型。   二、 […]

Android读写Txt文本文件代码 Android开发技术

   在Android平台中经常要用到Txt文本文件的读写操作,Android平台中处理Text这样的文本MIME的文件可以使用Java虚拟机的FileWriter类比较简单方便。该类位于java.io.FileWriter,提供了多种重写方法  FileWriter(File file)  //创建文件通过File对象  FileWriter(File file, boolean append) //如果文件存在,第二个参数设置为false则覆盖,为true则代表追加方式。  FileWriter(FileDescriptor fd)  //通过FileDescriptor对象来生成文件  FileWriter(String filename)  //写入文件,参数为完整的路径和文件名  FileWriter(String filename, boolean append)  //第二个参数通第二种重载方式一样。   因为该类从java.io.OutputStreamWriter继承,具备void  close()  void  flush()  String  getEncoding() void  write(char[] buf, int offset, int count)  void  write(String str, int offset, int count)  void  write(int oneChar)    还可以使用java.io.Writer Writer  append(CharSequence csq)  Writer  append(CharSequence csq, int start, int end)  Writer  append(char c)  abstract […]

Android多线程下载远程图片 Android开发技术

  很多时候我们需要在Android设备上下载远程服务器上的图片进行显示,今天Android123整理出两种比较好的方法来实现远程图片的下载。   方法一、直接通过Android提供的Http类访问远程服务器,这里AndroidHttpClient是SDK 2.2中新出的方法,API Level为8,大家需要注意下,静态访问可以直接调用,如果SDK版本较低可以考虑Apache的Http库,当然HttpURLConnection或URLConnection也可以。    static Bitmap downloadBitmapByCwj(String url) {     final AndroidHttpClient client = AndroidHttpClient.newInstance("Android123");     final HttpGet getRequest = new HttpGet(url);      try {         HttpResponse response = client.execute(getRequest);         final int statusCode = response.getStatusLine().getStatusCode();         if (statusCode != HttpStatus.SC_OK) {              Log.e("cwjDebug", "Error " + statusCode + " while retrieving […]

Android游戏开发之旅18 SoundPool类 Android开发技术

  对于Android的游戏音效播放,上次Android123已经告诉大家使用SoundPool类来实现,由于本次我们的游戏需要多种音效同时播放所以就选择了SoundPool类,它和Android提供常规的MediaPlayer类有哪些不同呢?   1. SoundPool载入音乐文件使用了独立的线程,不会阻塞UI主线程的操作。但是这里Android开发网提醒大家如果音效文件过大没有载入完成,我们调用play方法时可能产生严重的后果,这里Android SDK提供了一个SoundPool.OnLoadCompleteListener类来帮助我们了解媒体文件是否载入完成,我们重载onLoadComplete(SoundPool soundPool, int sampleId, int status) 方法即可获得。   2. 从上面的onLoadComplete方法可以看出该类有很多参数,比如类似id,是的SoundPool在load时可以处理多个媒体一次初始化并放入内存中,这里效率比MediaPlayer高了很多。   3. SoundPool类支持同时播放多个音效,这对于游戏来说是十分必要的,而MediaPlayer类是同步执行的只能一个文件一个文件的播放。   SoundPool类使用示例代码:   SoundPool sp=new SoundPool(8, /*maxStreams*/, AudioManager.STREAM_MUSIC /*streamType*/, 100 /*srcQuality*/) ;   有关载入音效的方法,有以下几种方法    int  load(Context context, int resId, int priority)  //从APK资源载入   int  load(FileDescriptor fd, long offset, long length, int priority)  //从FileDescriptor对象载入   int  load(AssetFileDescriptor afd, int priority)  //从Asset对象载入   […]

Android开发工具-App Inventor Android开发技术

  随着Android设备的普及为了让更多的人参与Android软件开发,这里Google官方提供了一个开发工具App Inventor可以让用户无需编写代码也能生成自己的APK软件。这里Android123也大家一个截图可以充分了解该工具的样子,可以看到整个IDE类似VB的样子,左边是控件工具箱,中间是界面布局视图,右边是组件和属性对话框,从左边提供的支持来看仍然更像儿童编程启蒙软件。不过对于入门级的Android软件开发来说的确可以试试这个相对更简单的工具,只需要点点鼠标就可以拥有自己的Android应用程序。     对于开发示例和代码,可以在 App Inventor for Android (英文) 上了解更多的使用方法和示例。

android调试工具monkey压力测试实战 Android开发技术

   很多Android开发者可能因为没有充分测试自己的软件造成很容易出现FC(Force Close)的问题,这里我们可以通过使用Android固件中自带的monkey工具来做软件的压力测试,monkey工具可以模拟各种按键,触屏,轨迹球、activity等事件,这里Android123提示大家说白了monkey就是一个小猴子随机狂玩你的android软件,看看会不会产生异常。   具体的使用我们通过Android SDK给我们的adb调试桥链接设备或模拟器,进入Linux Shell状态,当然我们可以输入adb shell获取设备的shell,也可以直接通过adb命令执行,比如说adb shell monkey来查看monkey工具中的参数说明,如图:    我们要测试的apk文件要在android设备中已经安装,当然模拟器中也可以测试的。执行adb shell monkey -p cn.com.android123.cwj -v 100 我们执行这句的中包含了p参数,这里代表已安装软件的packageName,而v代表查看monkey生成的详细随机事件名,最后的数字100为我们测试的随机事件数量为100.有关更多的测试方法,请查看上图中的参数,整个测试比较简单单很有效,不妨试试。 

保护你的Android付费软件-LVL全攻略 Android开发技术

  Google近期开始打击盗版Android软件,为开发者提供了 License Verification Library (LVL) 方式来防止Android软件被盗版,通过Android Market Licensing服务,提交的软件可以自动通过Market安全验证来限制授权情况,这一特性从Android SDK 1.5即API Level 3开始支持。LVL的原理主要是通过网络检查你应用是否通过购买,当然了谷歌并没有直接连接服务器而是通过远程IPC方式检查,如果连通网络会尝试判断应用是否授权,当然Google设计时加入了无网络验证的最低执行次数验证,比如执行了多少次后不网络验证将无法运行。   Android反盗版保护LVL的实战具体使用,首先我们在Eclipse中打开Android SDK and AVD Manager,选择Available Packages这项,单击Refresh可以找到Market Licensing package,revision 1这项,我们单击Install Selected即可,如图    LVL使用了RSA公钥对比方式验证软件是否得到购买许可,所以在编译apk文件时就要加入整个反盗版机制的相关的代码和密钥,在License Verification Library (LVL) 中我们需要经历以下步骤,获取一个许可公钥在Android Market的发布账号中,然后调试程序,最终发布     1. 在Market发布页面可以找到Licensing这项,我们可以加入开发者的测试Gmail账户,下面生成的是你的公钥,当然从大小写和结尾的=来看是Base64编码的,如图   接下来,我们可以查看在AVD和SDK管理器中下载的库文件和示例,路径位置如下 <sdk>/market_licensing/library/   (the LVL library project)<sdk>/market_licensing/sample/  (the example application)   当然,开发Android程序有多种方式,比如Eclipse或Ants脚本编译,如果使用Eclipse方式,可以选择当前程序的属性,在左边Android这也中,添加引用库为我们下载的,一般在<sdk根目录>/market_licensing/library/ 文件夹中,如图     当然,如果使用ants方式可以通过在default.properties 文件中加入android.library.reference.1=path/to/library_project这句,或使用sdk工具下的android批处理或bash脚本执行   android update lib-project –target […]

保护你的Android付费软件-LVL全攻略(二) Android开发技术

  昨天我们介绍了Android Market新的付费软件保护机制-LVL我们今天一起来看看如何集成密钥以及LVL库到Android项目中,这样做目前可以有效保证及时是Root权限的设备也无法正常的使用。  1. 在项目的androidmanifest.xml文件中加入<uses-permission android:name="com.android.vending.CHECK_LICENSE">权限,使其Market客户端可以检测授权状态。  2.制定一个策略Policy,本质上 Android Market licensing 服务并没有判断给用户赋予什么样的权限,在Policy接口中提供了两个方法分别为allowAccess() 和 processServerResponse() 他们均被 LicenseChecker 从服务器响应权限信息明确时被回调。    processServerResponse() 的原始定义 lets you preprocess the raw response data received from the licensing server, prior to determining whether to grant access.    allowAccess() 的解释为determines whether to grant the user access to your application, based on any available license response data (from the […]

Android游戏开发之旅19 分辨率大全 Android开发技术

  对于Android游戏开发我们不得不像iPhone那样思考兼容Android平板电脑,对于苹果要考虑iPad、iPhone 3GS和iPhone 4等屏幕之间的兼容性,对于几乎所有的分辨率Android123总结了大约超过20中粉笔阿女郎的大小和对应关系,对于开发Android游戏而言可以考虑到未来的3.0以及很多平板电脑的需要。   常规的我们可能只考虑QVGA,HVGA,WVGA,FWVGA和DVGA,但是抛去了手机不谈,可能平板使用类似 WSVGA的1024×576以及WXGA的1280×768等等。 QVGA = 320 * 240;WQVGA = 320 * 480;WQVGA2 = 400 * 240;WQVGA3 = 432 * 240;HVGA = 480 * 320;VGA = 640 * 480;WVGA = 800 * 480;WVGA2 = 768 * 480;FWVGA = 854 * 480;DVGA = 960 * 640;PAL = 576 * 520;NTSC = 486 * […]

Android游戏开发之旅20 双按事件捕获 Android开发技术

   对于游戏开发中我们可能经常要用到双按屏幕,在Android 1.6以前并没有提供完善的手势识别类,在Android 1.5 SDK中我们可以找到android.view.GestureDetector.OnDoubleTapListener,但是经过测试仍然无法正常工作,不知道什么原因,如果您知道可以联系android123@163.com共享下。最终我们使用的解决方法如下      最终我们测试的如下:    public class TouchLayout extends RelativeLayout {     public Handler doubleTapHandler = null;     protected long lastDown = -1;    public final static long DOUBLE_TIME = 500;   public TouchLayout(Context context) {       super(context);          }     public TouchLayout(Context context, AttributeSet attrs) {       super(context, attrs);          }     public TouchLayout(Context context, […]

Android Txt文本读写类源代码 Android开发技术

   Android系统内部提供了一个不错的txt文本读写类,但目前并没有公开提供给标准的SDK,FileUtils类的源代码如下,可以很好的操作Linux下的文本文件。 public class FileUtils{    public static final int S_IRWXU = 00700;    public static final int S_IRUSR = 00400;    public static final int S_IWUSR = 00200;    public static final int S_IXUSR = 00100;     public static final int S_IRWXG = 00070;    public static final int S_IRGRP = 00040;    public static final int S_IWGRP = 00020;    […]

Android调试技巧之Eclipse行号和Logcat Android开发技术

  很多初入Android的开发者可能会发现经常遇到Force Close或ANR这样的问题,一般我们通过Android系统的错误日志打印工具Logcat可以看到出错的内容,今天一起来说下如何通过Eclipse行号和Logcat捕捉出错点,我们遇到错误可以首先在Eclipse的DDMS中自带的Logcat组件查看错误,一般错误原因是Caused by XXX引起的,如下面我们可以看到因为android.widget.TextView是系统的类,由于没有太大的问题所以向前找可以看到我们的onCreate (test.java 20)这句是我们创建的Android工程位置,所以应该在Java代码的第20行查找。如图    默认的Eclipse是不显示行号的,我们可以通过到Eclipse的菜单中找Window -> Prefences    在Preferences对话框中依次进入General -> Editors -> Text Editors 并勾选 show line numbers即可,如图   当然Android123告诉大家已经更简单的快捷方式,在Eclipse直接按下Ctrl+F10键,在弹出的菜单中选择Show Line Numbers也可以显示行号,这对于调试Android应用来说十分的方便,平时我们出错竟然可以报告出在代码的第几行,虽然Google使用APK的方式通过Dalvik字节码方式可以增加了一些反编译Java程序的难度,虽然没有像反编译.class文件那么复杂,也许你不会ida这样的调试工具,不过Android开发网将在近期讲下如何通过GDB和DEXDUMP以及android123开发的一个小工具来最大化的反编译apk文件中的dex,还原出程序的源代码。

Android通过Intent发送电子邮件含附件 Android开发技术

   如何在Android系统中发送带附件的电子邮件呢? 其实通过Intent可以很方便的发送Email,只需要短短10行代码就可以处理,这里Android开发网就以在sdcard上的android123.cwj文件为例,通过Intent来发送电子邮件。完整代码如下 File file = new File("\sdcard\android123.cwj"); //附件文件地址  Intent intent = new Intent(Intent.ACTION_SEND); intent.putExtra("subject", file.getName()); // intent.putExtra("body", "android123 – email sender"); //正文 intent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(file)); //添加附件,附件为file对象            if (file.getName().endsWith(".gz")) {                intent.setType("application/x-gzip"); //如果是gz使用gzip的mime            } else if (file.getName().endsWith(".txt")) {                intent.setType("text/plain"); //纯文本则用text/plain的mime            } else {                intent.setType("application/octet-stream"); //其他的均使用流当做二进制数据来发送            }  startActivity(intent); //调用系统的mail客户端进行发送

Android自定义View以及layout属性全攻略 Android开发技术

  对于Android系统的自定义View可能大家都熟悉了,对于自定义View的属性添加,以及Android的Layout的命名空间问题,很多网友还不是很清楚,今天Android123一起再带大家温习一下   CwjView myView=new CwjView(context);   如果用于游戏或整个窗体的界面,我们可能直接在onCreate中setContentView(myView); 当然如果是控件,我们可能会需要从Layout的xml中声明,比如   <cn.com.android123.CwjView    android:layout_width="wrap_content"   android:layout_height="wrap_content"  />   当然,我们也可以直接从父类声明比如   <View class="cn.com.android123.CwjView"    android:layout_width="wrap_content"   android:layout_height="wrap_content"  /> 上面我们仅用了父类View的两个属性,均来自android命名空间,而名称为layout_width或layout_height,我们自定义的控件可能有更多的功能,比如     <cn.com.android123.CwjView    android:layout_width="wrap_content"   android:layout_height="wrap_content"   cwj:age="22"   cwj:university="sjtu"   cwj:city="shanghai"   />  我们可以看到上面的三个属性,是我们自定义的。作为标准xml规范,可能还包含了类似 xmlns:android="http://schemas.android.com/apk/res/android"  这样的语句,对于定义完整的View,我们的命名空间为cwj,这里可以写为 xmlns:cwj=http://schemas.android.com/apk/res/cn.com.android123.cwjView 或 xmlns:cwj=http://schemas.android.com/apk/res/android 都可以。   对于定义的cwj命名空间和age、university以及city的三个属性我们如何定义呢? 在工程的res/values目录中我们新建一个cwj_attr.xml文件,编码方式为utf-8是一个好习惯,内容如下 <?xml version="1.0" encoding="utf-8" ?> <resources>  <declare-styleable name="CwjView">  <attr name="age" format="integer" /> […]

Android Picture和PictureDrawable的用处 Android开发技术

  在Android系统中图形类为我们提供了很多图形对象类,很多网友知道Drawable,了解Bitmap之类的,那么今天的Picture和PictureDrawable又是什么东西呢? Android123再次给大家说下,Picture在android.graphics.Picture包中,相对于Drawable和Bitmap而言,Picture对象就小巧的多,它并不存储实际的像素,仅仅记录了每个绘制的过程。整个类提供了两个重载形式,其中比较特别的是Picture(Picture src) 从一个Picture对象去实例化操作, Canvas  beginRecording(int width, int height)  //开始记录绘制过程 static Picture  createFromStream(InputStream stream)  //静态方法,从输入流创建一个Pictrue对象 void  draw(Canvas canvas)  //在canvas上画这个picture对象 void  endRecording()  //结束录制绘制过程 int  getHeight() int  getWidth()  void  writeToStream(OutputStream stream)  //将绘制结果写到输出流中 我们可以看到整个类中方法不多,但主要的beginRecording和endRecording记录开始和结束,最终通过draw方法绘制到画布上去,而createFromStream和writeToStream可以帮助我们从流中读写这个Picture对象,我们可以将整个绘制过程通过FileInputStream或FileOutputStream放到文件中去。  PictureDrawable是什么呢? 这里Android123提示大家它位于android.graphics.drawable.PictureDrawable 是从Drawable类继承而来的,它的构造方法只有一个就是从Picture对象中实例化,PictureDrawable(Picture picture) void  draw(Canvas canvas)  // 绘制到Canvas int  getIntrinsicHeight() int  getIntrinsicWidth() int  getOpacity()  //获取透明度级别 Picture  getPicture()  //从PictureDrawable转为Picture void  setAlpha(int alpha)  //设置透明级别 void  setColorFilter(ColorFilter colorFilter)  void  setDither(boolean […]

Android AIDL全攻略一 Android开发技术

  Android的服务开发中我们可能都是Activity和Service同进程处理,但想象过系统提供的各种ServiceManager吗? 比如 SensorManager、SmsManager 这些服务可以提供给任意应用,对于这样的公共后台服务器开发类似我们在Win32的COM组件或Symbian的C/S框架,我们需要AIDL(Android Interface Definition Language即Android接口定义语言)来支持服务IPC(interprocess communication IPC)和各个进程的组件进行通讯。    我们将分5节完成以下几个问题   1. AIDL的概念 (本节)    2. Service绑定    3. AIDL基础框架    4. Parcelable    5. Android开源项目中的AIDL示例分析    使用Win32+Eclipse+ADT开发的网友可以通过在SDK的platform/android-x.y/tools文件夹中找到 aidl.exe 文件,这里android123提醒大家注意的是并不是sdk根目录下的tools文件一定要进入到platform中去,其中android-x.y是相应的sdk版本。我们首先执行无参数的aidl可以看到完整的帮助如图:      当然从目前的新版ADT插件来说可以自动的通过AIDL文件生成Java代码,如果使用Ants方式编译可以考虑上面的cmd命令行方式  

100% Secure Checkout

PayPal / MasterCard / Visa