随笔 - 632  文章 - 17  评论 - 54  阅读 - 93万

使用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);
    }

}
复制代码

 

posted on   飘杨......  阅读(2586)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示