学习android两个多月了,开始时连java都没搞懂是啥玩意,幸好有些c,c++基础。然后每天看博客,逛论坛。渐渐的对java的语法,应用等方面有了些了解。一直以来,看到像qq,新浪微博等软件,特别是游戏的界面,都非常神往。想和某一天也可以开发个应用程序能够拥有如此绚丽的界面。

心理有些冲动了,果断在当当上买了一本《android2.0游戏看法实战宝典》,开始了学习之路。

一般来说,实现用户的交互,按钮是很常用的控件,android自带的按钮太经典了,有点确认个人色彩。因此我自己动手些了个ImageButton的类,方便以后的使用。ImageButton这个类要实现的方法主要有一下几点:1.检测触摸屏按下的位置是否为按钮所在的区域;2.点击按钮的时候反馈信息给用户,我这里为了简单起见,主要给按钮加了个边框而已;3.最重要的,当然是实现相应事件了。

一下是基于canvas应用的ImageButton类的代码:

package lxx.mygame;import android.graphics.Bitmap;import android.graphics.Canvas;import android.graphics.Paint;import android.graphics.Rect;import android.graphics.Paint.Style;import android.util.Log;public class ImageButton { Bitmap bitmap; Rect rect; int x;  int y; boolean isTouch = false;    ImageButton(Bitmap bitmap, int x, int y){ this.bitmap = bitmap;//得到图片资源 this.x = x; this.y = y; rect = new Rect(x,y,x+bitmap.getWidth(),y+bitmap.getHeight());//记录位图的矩形区域  }    public void drawImage(Canvas canvas){//界面上显示ImageButton canvas.drawBitmap(bitmap, x, y, null);  if(isTouch ){//检测触摸点是否在按钮区域,然后决定是否加边框  Paint borderPaint = new Paint();  borderPaint.setStyle(Style.STROKE);  borderPaint.setARGB(255, 255, 0, 0);  borderPaint.setStrokeWidth(4f);  canvas.drawRect(rect, borderPaint);     }     }  public boolean getClicked(int x, int y){){//检测触摸点是否在按钮区域  boolean ret = false;  if(rect.contains(x,y))  {  ret = true;   isTouch = true;  }    return ret;   }    public void getButtonUp(){//检测触摸屏的释放      isTouch = false;  }    public void dragButton(int x, int y){//拖动按钮   if(isTouch){     this.x = x;//保存新的坐标     this.y = y;      int width = bitmap.getWidth();     int height = bitmap.getHeight();     rect = new Rect(x,y,x+width,y+height);    Log.d("Season","x:" + x + " y:"+y) ;    }     }     }


Activity中的代码如下:

package lxx.mygame;import android.app.Activity;import android.content.pm.ActivityInfo;import android.os.Bundle;import android.view.Window;import android.view.WindowManager;public class MygameActivity extends Activity {    /** Called when the activity is first created. */ WelcomView welcomView;    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);                requestWindowFeature(Window.FEATURE_NO_TITLE);//去掉标题        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,                        WindowManager.LayoutParams.FLAG_FULLSCREEN);//全屏显示                setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);//横屏显示        welcomView = new WelcomView(this);        setContentView(welcomView);       }       }


WelcomView 类主要实现触摸屏位置的检测,然后对按钮进行相应的处理

package lxx.mygame;import android.content.Context;import android.content.res.Resources;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.view.MotionEvent;import android.view.SurfaceHolder;import android.view.SurfaceView;import android.widget.Toast;public class WelcomView extends SurfaceView implements SurfaceHolder.Callback{  MygameActivity father; WelcomThread welcomThread; Bitmap background; Bitmap startBitmap; Bitmap clubBitmap; Bitmap speedBitmap; ImageButton start; ImageButton club; boolean speedEnable = false; int x; int y; public WelcomView(MygameActivity father) {  super(father);  // TODO Auto-generated constructor stub  this.father = father;  getHolder().addCallback(this);  initBitmap(father);  start = new ImageButton(startBitmap,40,40);  club = new ImageButton(clubBitmap,100,40);   } public void doDraw(Canvas canvas){  Paint paint = new Paint();  paint.setColor(Color.BLACK);    canvas.drawColor(Color.BLACK);  canvas.drawBitmap(background, 0,0, null);    start.drawImage(canvas);  club.drawImage(canvas);     }





@Override public boolean onTouchEvent(MotionEvent event) {  // TODO Auto-generated method stub  int x = (int) event.getX();  int y = (int) event.getY();    switch(event.getAction())  {   case MotionEvent.ACTION_DOWN://按下按钮    if(start.getClicked(x, y)){     Toast.makeText(getContext(), "你点击了开始按钮", Toast.LENGTH_SHORT).show();       }       if(club.getClicked(x, y)){     Toast.makeText(getContext(), "你点击了club按钮", Toast.LENGTH_SHORT).show();    }                         this.x = x;      this.y= y;                 break;       case MotionEvent.ACTION_UP://释放按钮     start.getButtonUp();     club.getButtonUp();     speedEnable =false;      this.x = x;      this.y= y;        break;           case MotionEvent.ACTION_MOVE://拖动按钮    start.dragButton(x, y);    club.dragButton(x, y);                this.x = x;      this.y= y;        break;               }        return true; }   public void initBitmap(Context context){//初始化图片资源  Resources r = context.getResources();  background = BitmapFactory.decodeResource(r, R.drawable.welcome);  startBitmap = BitmapFactory.decodeResource(r, R.drawable.start);  clubBitmap = BitmapFactory.decodeResource(r, R.drawable.club);    }    @Override public void surfaceChanged(SurfaceHolder holder, int format, int width,   int height) {  // TODO Auto-generated method stub   } @Override public void surfaceCreated(SurfaceHolder holder) {  // TODO Auto-generated method stub  welcomThread = new WelcomThread(this,getHolder());  this.welcomThread.flag = true;  welcomThread.start();    } @Override public void surfaceDestroyed(SurfaceHolder holder) {  // TODO Auto-generated method stub  boolean retry =true;  welcomThread.flag = false;  while(retry){   try{     welcomThread.join();//等待线程的结束        retry = false;    }   catch(InterruptedException e){        e.printStackTrace();   }  }    }   }


在WelcomThread中主要定时的刷新界面

package lxx.mygame;import android.graphics.Canvas;import android.util.Log;import android.view.SurfaceHolder;public class WelcomThread extends Thread{    int sleepSpan = 50;    WelcomView father;    SurfaceHolder surfaceHolder;    boolean flag ;        WelcomThread(WelcomView father, SurfaceHolder surfaceHolder){     this.father = father;     this.surfaceHolder = surfaceHolder;     this.flag = true;    }     @Override public void run() {  // TODO Auto-generated method stub   Canvas canvas = null;   while(flag){    try{     canvas = surfaceHolder.lockCanvas(null);//锁住画布     synchronized(surfaceHolder){      father.doDraw(canvas);                }    }        catch(Exception e)    {   e.printStackTrace();          }        finally{     if(canvas != null)     {    surfaceHolder.unlockCanvasAndPost(canvas);  //显示新的画布     }       }            try{     Thread.sleep(sleepSpan);  //休眠一小会    }        catch (Exception e)    {   e.printStackTrace();           }         } }  }

为了方便大家学习交流,特意提供源码下载地址:

http://download.csdn.net/source/3556628


最后的显示效果如下图,可以任意拖动按钮并触发事件等,因为比较细化极品飞车,就把他弄了个背景,哈哈

更多相关文章

  1. android button 背景样式
  2. Android定制视图及手势检测的基本示例
  3. [Android] 仿照 Last App Switcher 写的小程序
  4. Android优雅地处理按钮重复点击
  5. 自定义Android带图片的按钮
  6. android如何实现注销功能
  7. Android(安卓)app实现自更新和安装,权限检测适配Android6.0以下和
  8. Android手机终端长连接心跳检测自动化测试方案
  9. Android(安卓)UI卡顿检测(一)——基于Handler机制的实现方案(线上方

随机推荐

  1. 详谈mysql order by in 的字符顺序(推荐)
  2. mysql的sql语句特殊处理语句总结(必看)
  3. mysql利用init-connect增加访问审计功能
  4. mysql 5.7.17的最新安装教程图文详解
  5. Mysql inner join on的用法实例(必看)
  6. MySQL 触发器详解及简单实例
  7. mysql服务启动却连接不上的解决方法
  8. mysql取得datetime类型的数据,后面会跟个
  9. InnoDB的关键特性-插入缓存,两次写,自适
  10. InnoDb 体系架构和特性详解 (Innodb存储