嗯、、、自己在游戏开发过程中遇到了这样一个问题
第一次手指按下记录当前坐标,然后第二次点击时判断是第一次点击的哪个方向(上、下、左、右、左上、左下、右上、右下)8个方向
于是乎,使出了程序员的主动技能——搜索
很遗憾,没有什么收获
只能硬头皮写了
刚开始,我是这样构思的。。。。
写起来发现不太容易写
于是乎
干脆这样写好了。。
果然容易的多
package layout; import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Color; import android.graphics.drawable.AnimationDrawable; import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; import android.util.Log; import android.view.MotionEvent; import android.view.View; import android.view.WindowManager; import android.widget.FrameLayout; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.TextView; import com.ask.jilun.R; /** */ public class WalkView extends FrameLayout implements View.OnTouchListener { private final int UP = 1; private final int DOWN = 2; private final int LEFT = 3; private final int RIGHT = 4; private final int UPPER_LEFT = 5; private final int BOTTOM_LEFT = 6; private final int UPPER_RIGHT = 7; private final int BOTTOM_RIGHT = 8; private final int UP_STATND = 9; private final int DOWN_STATND = 10; private final int LEFT_STATND = 11; private final int RIGHT_STATND = 12; private final int UPPER_LEFT_STATND = 13; private final int BOTTOM_LEFT_STATND = 14; private final int UPPER_RIGHT_STATND = 15; private final int BOTTOM_RIGHT_STATND = 16; private ImageView walkImg;//人物 private Context context; private int windowWidth;//屏幕宽高 private int windowHeight; private int characterX;//人物的坐标 private int characterY; public WalkView(Context context) { super(context); this.context = context; WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); characterX = windowWidth = wm.getDefaultDisplay().getWidth(); characterY = windowHeight = wm.getDefaultDisplay().getHeight(); characterX = windowWidth/2 - 30; characterY = windowHeight/2 - 38; initView(); } private void initView(){ setOnTouchListener(this);//设置监听 walkImg = new ImageView(context); walkImg.setLayoutParams(new LinearLayout.LayoutParams(60,76)); walkImg.setImageResource(R.drawable.zoudong1); walkImg.setX(windowWidth/2-30); walkImg.setY(windowHeight/2-38); addView(walkImg); addView(frameLayout); } private void selectDirection(int direction ,int x , int y ,int newX ,int newY){ int distance = (int) Math.sqrt(Math.pow((x - newX),2)+Math.pow((y - newY),2));//获取两点间距离 switch (direction){ case UP: break; case DOWN: break; case LEFT: break; case RIGHT: break; case UPPER_LEFT: break; case BOTTOM_LEFT: break; case UPPER_RIGHT: break; case BOTTOM_RIGHT: break; case UP_STATND: break; case DOWN_STATND: break; case LEFT_STATND: break; case RIGHT_STATND: break; case UPPER_LEFT_STATND: break; case BOTTOM_LEFT_STATND: break; case UPPER_RIGHT_STATND: break; case BOTTOM_RIGHT_STATND: break; } } private int toucheJudge(int x , int y){ int bitmapX = (int) walkImg.getX(); int bitmapY = (int) walkImg.getY(); int bitmapWith = walkImg.getWidth(); int bitmapHeight = walkImg.getHeight(); if(x > bitmapX && x < (bitmapX + bitmapWith) && y < bitmapY){ Log.e("","判断 上"); return UP; }else if(x > bitmapX && x < (bitmapX + bitmapWith) && y > (bitmapY + bitmapHeight)){ Log.e("","判断 下"); return DOWN; }else if(y > bitmapY && y < (bitmapY + bitmapHeight) && x < bitmapX){ Log.e("","判断 左"); return LEFT; }else if(y > bitmapY && y < (bitmapY + bitmapHeight) && x > (bitmapX + bitmapWith)){ Log.e("","判断 右"); return RIGHT; }else if(x < bitmapX && y < bitmapY){ Log.e("","判断 左上"); return UPPER_LEFT; }else if(y > (bitmapY + bitmapHeight) && x < bitmapX){ Log.e("","判断 左下"); return BOTTOM_LEFT; }else if(x > (bitmapX + bitmapWith) && y < bitmapY){ Log.e("","判断 右上"); return UPPER_RIGHT; }else if(x > (bitmapX + bitmapWith) && y > (bitmapY+ bitmapHeight)){ Log.e("","判断 右下"); return BOTTOM_RIGHT; } return 0; } boolean isFirstOnTouch = false; @Override public boolean onTouch(View v, MotionEvent event) { int x = 0; int y = 0; int newX = 0; int newY = 0; switch (event.getAction()){ case MotionEvent.ACTION_DOWN: x = (int) event.getX(); y = (int) event.getY(); Log.e("","按下x:"+x); Log.e("","按下y:"+y); toucheJudge(newX,newY); break; case MotionEvent.ACTION_MOVE: break; case MotionEvent.ACTION_UP: break; default: super.onTouchEvent(event); } return true; } }就这样搞定了,测试发现还挺好用的