获取触地移动 Rect 对象

Getting the touchdown to move a Rect object

我试图让这个 paddle_user 在触摸屏幕时垂直移动。但是桨没有动。我已经仔细检查了 onTouch 代码,但我仍然无法找出我做错了什么。

    package com.nblsoft.pong;

import android.content.Context;
import android.content.res.Configuration;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.view.MotionEvent;
import android.view.View;



public class PongLogic extends View implements View.OnTouchListener  {

    //set screen constrains in dip
    Configuration configuration = this.getResources().getConfiguration();
    int dpHeight = configuration.screenHeightDp; //The current height of the available screen space, in dp units, corresponding to screen height resource qualifier.
    int dpWidth = configuration.screenWidthDp; //The current width of the available screen space, in dp units, corresponding to screen width resource qualifier.

        //int smallestScreenWidthDp = configuration.smallestScreenWidthDp; //The smallest screen size an application will see in normal operation, corresponding to smallest screen width resource qualifier.


        //DisplayMetrics displayMetrics = this.getResources().getDisplayMetrics();
        //float dpHeight = displayMetrics.heightPixels / displayMetrics.density;
        //float dpWidth = displayMetrics.widthPixels / displayMetrics.density;

    private int dptopixel(int DESIRED_DP_VALUE){

        final float scale = getResources().getDisplayMetrics().density;

        return (int)((DESIRED_DP_VALUE) * scale + 0.5f);
    }

    private int pixeltodp(int DESIRED_PIXEL_VALUE){

        final float scale = getResources().getDisplayMetrics().density;

        return (int) ((DESIRED_PIXEL_VALUE) - 0.5f / scale);
    }

    //set paddle size, speed, position vector

    int paddle_pos_x  = 4 * (dptopixel(dpWidth)/100);           //3 for 320x480, 10 for 1080x1920 etc.
    int paddle_width  =     (dptopixel(dpWidth)/10);            //
    int paddle_pos_y  =     (dptopixel(dpHeight)/10);           //48 for 320x480, 190 for 1080x1920 etc.
    int paddle_height =     (dptopixel(dpHeight)/100) + 3;      //the paddle is 100% of the total height of phone.

    int user_paddle_pos_x = 4 * (dptopixel(dpWidth)/100) ;
    int user_paddle_pos_y = dptopixel(dpHeight) - ((dptopixel(dpHeight)/10) + (dptopixel(dpHeight)/100) + 3)  ;

    //User Paddle
    public Rect paddle_user = new Rect(user_paddle_pos_x,
                                user_paddle_pos_y,
                                user_paddle_pos_x + paddle_width,
                                user_paddle_pos_y + paddle_height);

    //AI paddle
    Rect paddle_AI = new Rect(paddle_pos_x,
                              paddle_pos_y,
                              paddle_pos_x + paddle_width,
                              paddle_pos_y + paddle_height);


    //set ball position vector, Velocity vector, acceleration

    //Override onDraw method
    @Override
    protected void onDraw(Canvas canvas){
        super.onDraw(canvas);

        Paint mytext  = new Paint();
        mytext.setColor(Color.WHITE);

        // Draw Middle point
        canvas.drawRect(0, ((dptopixel(dpHeight)) / 2), (dptopixel(dpWidth)), (((dptopixel(dpHeight)) / 2) + 2), mytext);

        canvas.drawRect(paddle_user,mytext);
        canvas.drawRect(paddle_AI, mytext);


    //Practise Methods
        //canvas.drawText(Integer.toString(dptopixel(dpHeight)),300,300,mytext);
        //canvas.drawText(Integer.toString(dptopixel(dpWidth)), 400, 400, mytext);

        //canvas.drawText(Integer.toString(dpHeight),500,500,mytext);
        //canvas.drawText(Integer.toString(dpWidth),600,600,mytext);

        //canvas.drawText("Fuck", 700, 700, mytext);
        //canvas.drawRect(0,0,dptopixel(dpWidth),dptopixel(dpHeight),mytext);
    }

    //Override Touch method

    @Override
    public boolean onTouch(View v, MotionEvent event) {
        int x = (int) event.getX();
        int y = (int) event.getY();

        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                paddle_user.offsetTo(10,0);
        }

        return true; //Event Handled
    }



    public PongLogic(Context context) {
        super(context);
        setBackgroundColor(Color.BLACK);            //to set background
        this.setFocusableInTouchMode(true);             //to enable touch mode
        this.setOnTouchListener(this);

    }



}

您必须实现 OnTouchListener 接口并执行 this.setOnTouchListener(this)。

编辑:

public class CustomClass extends View implements View.OnTouchListener{}

然后在构造函数中添加 this.setOnTouchListener(this);

编辑2:

好吧,我忘了告诉你,但是当你对 rect 进行一些修改时,你必须调用 draw 方法,为了正确地做到这一点,你调用了 invalidate。所以在你的 ontouch 方法中添加 invalidate().

这里是我做的代码,如果你想检查的话(我只是删减了你的代码以获得一个更简单的例子):

public class PongLogic extends View implements View.OnTouchListener {



//set ball position vector, Velocity vector, acceleration
   Rect paddle_user = new Rect(0, 100, 100, 200);

public PongLogic(Context context, AttributeSet attrs) {
    super(context, attrs);
    this.setOnTouchListener(this);
    setBackgroundColor(Color.BLACK);            //to set background
    this.setFocusableInTouchMode(true);
}

//Override onDraw method
@Override
protected void onDraw(Canvas canvas){
    super.onDraw(canvas);

    Paint mytext  = new Paint();
    mytext.setColor(Color.WHITE);
    mytext.setStyle(Paint.Style.STROKE);
    mytext.setStrokeWidth(2);

    canvas.drawRect(paddle_user, mytext);

}

@Override
public boolean onTouch(View v, MotionEvent event) {
    paddle_user.offsetTo(0,0);
    invalidate();
    return false;
}
}

所以你错过的基本上是 invalidate() 方法。因此,您在乞讨中所做的第一个 OnTouch 方法并没有错,但如果您制作自定义视图,则更好地处理界面。