Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/178.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在android surfaceview中水平和垂直直线或倾斜移动对象_Android_Canvas_Bitmap_Surfaceview - Fatal编程技术网

如何在android surfaceview中水平和垂直直线或倾斜移动对象

如何在android surfaceview中水平和垂直直线或倾斜移动对象,android,canvas,bitmap,surfaceview,Android,Canvas,Bitmap,Surfaceview,我的应用程序中有一个球,它随着触摸而移动。我只是想让它只水平、垂直或倾斜地移动,而不是让它曲折地移动,我厌倦了遵循代码,它工作得很好 public class MainActivity extends Activity implements OnTouchListener { Ourview v; Bitmap ball; float x,y; @Override public void onCreate(Bundle savedInstanceState) { super.onCr

我的应用程序中有一个球,它随着触摸而移动。我只是想让它只水平、垂直或倾斜地移动,而不是让它曲折地移动,我厌倦了遵循代码,它工作得很好

public class MainActivity extends Activity implements OnTouchListener {

Ourview v;
Bitmap ball;
float x,y;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    v = new Ourview(this);
    v.setOnTouchListener(this);
    ball = BitmapFactory.decodeResource(getResources(), R.drawable.circle_green);
    x = y = 0;
    setContentView(v);
}


@Override
protected void onPause() {
    // TODO Auto-generated method stub
    super.onPause();
    v.pause();
}

@Override
protected void onResume() {
    // TODO Auto-generated method stub
    super.onResume();
    v.resume();
}

public class Ourview extends SurfaceView implements Runnable{

    Thread t = null;
    SurfaceHolder holder;
    boolean isItOk = false;

    public Ourview(Context context) {
        super(context);
        // TODO Auto-generated constructor stub
        holder = getHolder();
    }

    public void run() {
        // TODO Auto-generated method stub
        while (isItOk == true){
            //perfom convas drawing
            if (!holder.getSurface().isValid()){
                continue;
            }
            Canvas c = holder.lockCanvas();
            c.drawARGB(250, 10, 50, 100);
            c.drawBitmap(ball, x - (ball.getWidth()/2), y - (ball.getHeight()/2), null);
            holder.unlockCanvasAndPost(c);
        }

    }

    public void pause(){
        isItOk = false;
        while(true){
            try{
                t.join();
            }catch (InterruptedException e){
                e.printStackTrace();
            }
            break;
        }
        t = null;

    }

    public void resume(){
        isItOk = true;
        t = new Thread(this);
        t.start();

    }

}

public boolean onTouch(View v, MotionEvent me) {
    // TODO Auto-generated method stub

    try {
        Thread.sleep(50);
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    switch(me.getAction()){
    case MotionEvent.ACTION_DOWN:
        x = me.getX();
        y = me.getY();
        break;
    case MotionEvent.ACTION_UP:
        x = me.getX();
        y = me.getY();
        break;
    case MotionEvent.ACTION_MOVE:
        x = me.getX();
        y = me.getY();
        break;
    }

    return true;
}

}
我的球在任何方向移动。我只想限制我的球只在水平、垂直或倾斜方向移动,它不应该以之字形移动


谢谢

您可以做一个测试,看看球应该朝哪个方向移动。首先,设置一个特定的阈值
t
。如果用户在x或y方向上移动超过
t
,则会记录移动。因此,计算
deltaX=x-me.getX()
deltaY=y-me.getY()

如果仅
deltaX>t
,则水平移动球。如果仅
deltaY>t
,则垂直移动球


如果两者都足够大,则在x和y方向上以相同的量移动球。这将使球沿对角线移动。

你可以做一个测试,看看球应该朝哪个方向移动。首先,设置一个特定的阈值
t
。如果用户在x或y方向上移动超过
t
,则会记录移动。因此,计算
deltaX=x-me.getX()
deltaY=y-me.getY()

如果仅
deltaX>t
,则水平移动球。如果仅
deltaY>t
,则垂直移动球

如果两者都足够大,则在x和y方向上以相同的量移动球。这将使球沿对角线移动。

在此处添加一些更改:

case MotionEvent.ACTION_DOWN:
        xStart = me.getX();
        yStart = me.getY();
        break;
    case MotionEvent.ACTION_UP:
        xEnd = me.getX();
        yEnd = me.getY();
        break;
    case MotionEvent.ACTION_MOVE:
        x = me.getX();
        y = me.getY();
        break;
然后在画布上画一条线:

c.drawLine(xStart,yStart,xEnd,YEnd,paint);
这将从开始触摸到结束触摸画一条直线希望这将对您有所帮助。

在此处添加一些更改:

case MotionEvent.ACTION_DOWN:
        xStart = me.getX();
        yStart = me.getY();
        break;
    case MotionEvent.ACTION_UP:
        xEnd = me.getX();
        yEnd = me.getY();
        break;
    case MotionEvent.ACTION_MOVE:
        x = me.getX();
        y = me.getY();
        break;
然后在画布上画一条线:

c.drawLine(xStart,yStart,xEnd,YEnd,paint);

这将从开始触摸到结束触摸划出一条直线希望这将对您有所帮助。

谢谢您的建议。看起来不错。如果你有我是新接触Android编程的,请粘贴一个代码剪贴。谢谢你的建议。看起来不错。如果你有我是android编程新手,请粘贴一个代码snippt