引言:在图形绘制中,控制一个图形(圆形,椭圆形,矩形,三角形)移动时,其实计算的都是该图形的中心点移动。在绘制过程中,首先计算出中心点,然后根据中心点的位置计算重图形的上下左右位置。我们假设图形左边为lx,图形右边为rx,图形上边为ty,图形下边为by,图形的中心点位置坐标为(cx,cy).手指触摸位置坐标为(x,y)
计算公式:
lx = x - cx; rx = x + cx; ty = y - cy; by = y + cy;
下面是控制图形移动的具体代码:
GameView.java
package com.yw.mygame.view; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.RectF; import android.view.KeyEvent; import android.view.MotionEvent; import android.view.View; public class GameView extends View{ private Paint paint = null; private int x = 0; private int y = 0; //椭圆形的left,right,top,buttom初始位置 private float lx = 0.0f; private float rx = 50.0f; private float ty = 0.0f; private float by = 100.0f; /** * 椭圆形的中心点坐标(要始终保证中心点的这两个值不变) */ private float cx = 25.0f; private float cy = 50.0f; public GameView(Context context) { super(context); this.setFocusable(true);//允许获取上层焦点 paint = new Paint(); paint.setColor(Color.GREEN); // new GameViewThread().start(); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); canvas.drawLine(x, 0, x, 480, paint); RectF rectf = new RectF(lx, ty, rx, by); canvas.drawOval(rectf, paint); } /*class GameViewThread extends Thread{ @Override public void run() { while(x <= 480){ x+=5; postInvalidate(); try { Thread.sleep(200); } catch (InterruptedException e) { e.printStackTrace(); } } } }*/ @Override public boolean onTouchEvent(MotionEvent event) { x = (int)event.getX(); //触摸位置 float x = event.getX(); float y = event.getY(); /*lx = cx - (rx-lx)/2; rx = cx + (rx-lx)/2; ty = cy - (by-ty)/2; by = cy + (by-ty)/2;*/ //改变椭圆形位置 lx = x - cx; rx = x + cx; ty = y - cy; by = y + cy; //对View进行重新绘制 postInvalidate(); return true; } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { return super.onKeyDown(keyCode, event); } @Override public boolean onKeyUp(int keyCode, KeyEvent event) { return super.onKeyUp(keyCode, event); } }
GameViewActivity.java
package com.yw.mygame; import com.yw.mygame.view.GameView; import android.app.Activity; import android.os.Bundle; public class GameViewActivity extends Activity{ private GameView gameView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); gameView = new GameView(this); setContentView(gameView); } }