使用Android绘图技术绘制一个椭圆形,然后通过触摸事件让该椭圆形跟着手指移动
引言:在图形绘制中,控制一个图形(圆形,椭圆形,矩形,三角形)移动时,其实计算的都是该图形的中心点移动。在绘制过程中,首先计算出中心点,然后根据中心点的位置计算重图形的上下左右位置。我们假设图形左边为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); } }
分类:
Android
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库