Android的自定义图片按钮ImageButton【第一篇】
16lz
2021-01-26
学习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
最后的显示效果如下图,可以任意拖动按钮并触发事件等,因为比较细化极品飞车,就把他弄了个背景,哈哈
更多相关文章
- android button 背景样式
- Android定制视图及手势检测的基本示例
- [Android] 仿照 Last App Switcher 写的小程序
- Android优雅地处理按钮重复点击
- 自定义Android带图片的按钮
- android如何实现注销功能
- Android(安卓)app实现自更新和安装,权限检测适配Android6.0以下和
- Android手机终端长连接心跳检测自动化测试方案
- Android(安卓)UI卡顿检测(一)——基于Handler机制的实现方案(线上方