Android 使用按钮保持选项移动对象

Android 使用按钮保持选项移动对象,android,button,Android,Button,我正在开发一个小的Android程序,遇到了一个问题。我必须在我的程序中设置为区域的按钮,当它们被触摸时,我希望它们移动一个对象。这是有效的。 问题是,我希望这些按钮在触摸精灵时保持其移动。目前,当我按下其中一个按钮时,它正在执行一次代码 只要按下按钮,我如何使按钮保持对象移动 谢谢大家! Region Rbleft = new Region(135,1585,450,1900); Region Rbright = new Region(630,1585,945,1900);

我正在开发一个小的Android程序,遇到了一个问题。我必须在我的程序中设置为区域的按钮,当它们被触摸时,我希望它们移动一个对象。这是有效的。 问题是,我希望这些按钮在触摸精灵时保持其移动。目前,当我按下其中一个按钮时,它正在执行一次代码

只要按下按钮,我如何使按钮保持对象移动

谢谢大家!

    Region Rbleft = new Region(135,1585,450,1900);
    Region Rbright = new Region(630,1585,945,1900);



public boolean onTouchEvent(MotionEvent event)
    {
        synchronized (getHolder()){
        float x = event.getX();
        float y = event.getY();

        if(Rbleft.contains((int)x, (int)y)){
            if(xw <= getWidth() - (lore.getWidth()/2)){
                xw=xw-1;
            }   
        }           
        else if(Rbright.contains((int)x, (int)y)){
            if(xw <= getWidth() - (lore.getWidth()/2)){
                xw=xw+1;
            }
        }

        return super.onTouchEvent(event);}
    }
Region Rbleft=新区域(13515854501900);
区域Rbright=新区域(63015859451900);
公共布尔onTouchEvent(运动事件)
{
已同步(getHolder()){
float x=event.getX();
float y=event.getY();
if(Rbleft.包含((int)x,(int)y)){

如果(xwOk)这里是一个只计算而不执行所需操作的示例,您可以将您的操作放入
doInBackground()
方法中。我在按钮上添加了一个触摸监听器,而不只是使用
onTouchEvent

Button b1;
boolean flag = false;
DoWork doWork;
int count = 0;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    b1 = (Button)findViewById(R.id.button);

    b1.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            if(event.getAction()==MotionEvent.ACTION_DOWN){
                Log.i("TAG", "Action Down Detected");
                flag = true;
                doWork = new DoWork();
                doWork.execute();
                return true;
            }

            if(event.getAction() == MotionEvent.ACTION_UP){
                Log.i("TAG", "Action Up Detected");
                flag = false;
                doWork.cancel(false);
                return true;
            }
            return false;
        }
    });

}

class DoWork extends AsyncTask<Void, Void, Void> {


    @Override
    protected void onPreExecute() {

    }

    @Override
    protected Void doInBackground(Void... resId) {
      while(flag) {
          synchronized (this) {
              this.sleep(100);
              count++;
          }
          Log.i("TAG", Integer.toString(count));
      }
        return null;
    }

    @Override
    protected void onProgressUpdate(Void... values) {

    }

    @Override
    protected void onPostExecute(Void result) {

    }

    private void sleep(int delay) {
        try {
            Thread.sleep(delay);
        } catch (InterruptedException e) {
            Log.e("TAG", e.toString());
        }
    }
}
按钮b1;
布尔标志=假;
嫁妆嫁妆;
整数计数=0;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
b1=(按钮)findViewById(R.id.Button);
b1.setOnTouchListener(新视图.OnTouchListener(){
@凌驾
公共布尔onTouch(视图v,运动事件){
if(event.getAction()==MotionEvent.ACTION\u向下){
Log.i(“标记”,“检测到动作下降”);
flag=true;
道工=新道工();
doWork.execute();
返回true;
}
if(event.getAction()==MotionEvent.ACTION\u UP){
Log.i(“标记”、“检测到动作”);
flag=false;
doWork.cancel(假);
返回true;
}
返回false;
}
});
}
类DoWork扩展了异步任务{
@凌驾
受保护的void onPreExecute(){
}
@凌驾
受保护的空位背景(空位…剩余){
while(旗帜){
已同步(此){
这个。睡眠(100);
计数++;
}
Log.i(“TAG”,Integer.toString(count));
}
返回null;
}
@凌驾
受保护的void onProgressUpdate(void…值){
}
@凌驾
受保护的void onPostExecute(void结果){
}
私有无效睡眠(整数延迟){
试一试{
睡眠(延迟);
}捕捉(中断异常e){
Log.e(“TAG”,e.toString());
}
}
}

睡眠方法将为您提供所需的速度控制。例如,1000=1秒延迟,您也可以使用以下过程:

    btn.setOnTouchListener(new View.OnTouchListener() {

           @Override
            public boolean onTouch(View view, final MotionEvent motionEvent) {
                if (btn.isPressed()){
                    countDownTimer = new CountDownTimer(1000,100) {


                        @Override
                        public void onTick(long l) {

                            btn.setEnabled(false);
                            if (!btn.isPressed()){
                                countDownTimer.cancel();
                                btn.setEnabled(true);

                            }



                        }

                        @Override
                        public void onFinish() {
                            btn.setEnabled(true);

                        //do whatever you want

                        }
                    }.start();

                }


                return false;

            }
        });

您可以通过对照MotionEvent.ACTION\u down常量检查
onTouch
中的运动事件来检查按钮是否被按下。我以多种不同的形式尝试了这一方法,但我甚至无法使用onTouch获得任何结果。与上面的代码相同。该操作执行一次,我希望在t时每0,1秒执行一次按钮仍被按下。您可以将您的同步方法移动到它自己的方法(在
onTouch
之外),然后您可以在
ACTION\u DOWN
中放置一个true标志,在
else
块中放置一个false标志。然后只需在(flag==true){
。好的,这种方法很有效。但是它太快了,对象直接在屏幕的一侧,有没有办法让while动作慢下来?可能是一帧一个动作?我相信while循环不能被打破,因为它只在第一个onTouch上反应。为此,你必须使用
异步任务
,我现在正在启动正在约会Android Studio,并将在完成后更新我的答案。感谢您的工作,但在按住按钮的同时获得带有动作的按钮真的很复杂吗?--