为了账号安全,请及时绑定邮箱和手机立即绑定

如何阻止对象离开屏幕?

如何阻止对象离开屏幕?

繁花如伊 2022-05-21 21:05:03
public class MovingBagView extends View {    private Bitmap bag[] = new Bitmap[2];    private int bagX;    private int bagY = 1000;    private int bagSpeed;    private Boolean touch = false;    private int canvasWidth, canvasHeight;    private Bitmap backgroundImage;    private Paint scorePaint = new Paint();    private Bitmap life[] = new Bitmap[2];    public MovingBagView(Context context) {        super(context);        bag[0] = BitmapFactory.decodeResource(getResources(), R.drawable.bag1);        bag[1] = BitmapFactory.decodeResource(getResources(), R.drawable.bag2);        backgroundImage = BitmapFactory.decodeResource(getResources(), R.drawable.background);        scorePaint.setColor(Color.BLACK);        scorePaint.setTextSize(40);        scorePaint.setTypeface(Typeface.DEFAULT_BOLD);        scorePaint.setAntiAlias(true);        life[0] = BitmapFactory.decodeResource(getResources(), R.drawable.heart);        life[1] = BitmapFactory.decodeResource(getResources(), R.drawable.heart_grey);        bagX = 10;    }    @Override    protected void onDraw(Canvas canvas) {        super.onDraw(canvas);        canvasWidth = canvas.getWidth();        canvasHeight = canvas.getHeight();        canvas.drawBitmap(backgroundImage, 0, 0, null);        int minBagX = bag[0].getWidth();        int maxBagX = canvasWidth - bag[0].getWidth() * 3;        bagX = bagX + bagSpeed;        if (bagX < minBagX) {            bagX = minBagX;        }        if (bagX < maxBagX) {            bagX = maxBagX;        }我可以点击屏幕将对象向左移动,我点击它的次数越多,它应该向左移动得越远。但是,问题是对象向右移动太多,并且离开了屏幕。我希望它停在边缘,所以它仍然在屏幕上可见。此外,对象位于屏幕的中心底部,如何将其定位到左下角?您可以通过查看下面的 GIF 来了解它是如何工作的。
查看完整描述

3 回答

?
炎炎设计

TA贡献1808条经验 获得超4个赞

此条件永远不会应用于您提供的代码。它继续超过最大值。


if (bagX < maxBagX) {

       bagX = maxBagX;

   }

它应该如下所示:


if (bagX >= maxBagX) {

       bagX = maxBagX;

   }

而maxBagX的值应该是canvasWidth - bag[0].getWidth()为了实现包本身的右边缘。(除非您出于不同的原因使用乘法 3 次,否则这应该是解决方案。)


查看完整回答
反对 回复 2022-05-21
?
杨__羊羊

TA贡献1943条经验 获得超7个赞

我是这样做的 //maintainoffscreen 函数将保持路径不移出屏幕,并返回 true ,否则如果路径没有碰撞到任何一侧,则返回 false,您可以通过设置偏移量来移动路径。


    private boolean maintainOffScreen(Path path, float px, float py){


    boolean done = true;

    RectF rectF = new RectF();

    path.computeBounds(rectF,true);

    float l = getPathWidth(path) - rectF.right;

    float r = getPathWidth(path) + rectF.left;

    float t = getPathHeight(path) - rectF.bottom;

    float b = getPathHeight(path)+ rectF.top;


    if(l < (-1) && r < getWidth() && b < getHeight() && t< (-1)){

        //if path does not collide to any side//you can move your path here as well

       //by setting Path.offset(px,py)

        done = false;

        offScreen = OffScreen.NOOFF; //im using these as enum according to my need, 

//as this is saving which side of screen collides


    }

    else if(l >= (-1)){

        path.offset(px+(l),py);

        offScreen = OffScreen.LEFT;

        offscrenn_xl = 1;

        done = true;


    }

    else if(r >= getWidth()){

        float s = getWidth() - r;

        path.offset(px+(s),py);

        offScreen = OffScreen.RIGHT;

        offscrenn_xr = s;

        done = true;

    }

    else if(b >= getHeight()){

        float s = getHeight() - b;

        path.offset(px,py+s);

        offScreen = OffScreen.BOTTOM;

        offscrenn_yb = s;

        done = true;

    }

    else if(t >= (-1)){

        path.offset(px,py+(t));

        offScreen = OffScreen.TOP;

        offscrenn_yt = t;

        done = true;

    }

    return done;

}

对 px,py 感到困惑?这是你的手指相对于路径的运动


`

final float px = event.getX() - this.startX;

final float py = event.getY() - this.startY;

if(!maintainOffScreen(path,px,py)){path.offset(px,py); }` //you should call

//this function here ,this will move your path to finger if there is no collision.

//and donot forgot to set the startx,and starty yo new positon like this

this.startX = event.getX();

this.startY = event.getY();


查看完整回答
反对 回复 2022-05-21
?
忽然笑

TA贡献1806条经验 获得超5个赞

创建您使用线性、相对或约束的布局对象,然后使用该对象获取屏幕宽度

object.getWidth();


查看完整回答
反对 回复 2022-05-21
  • 3 回答
  • 0 关注
  • 128 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号