Android 使用按钮保持选项移动对象
我正在开发一个小的Android程序,遇到了一个问题。我必须在我的程序中设置为区域的按钮,当它们被触摸时,我希望它们移动一个对象。这是有效的。 问题是,我希望这些按钮在触摸精灵时保持其移动。目前,当我按下其中一个按钮时,它正在执行一次代码 只要按下按钮,我如何使按钮保持对象移动 谢谢大家!Android 使用按钮保持选项移动对象,android,button,Android,Button,我正在开发一个小的Android程序,遇到了一个问题。我必须在我的程序中设置为区域的按钮,当它们被触摸时,我希望它们移动一个对象。这是有效的。 问题是,我希望这些按钮在触摸精灵时保持其移动。目前,当我按下其中一个按钮时,它正在执行一次代码 只要按下按钮,我如何使按钮保持对象移动 谢谢大家! Region Rbleft = new Region(135,1585,450,1900); Region Rbright = new Region(630,1585,945,1900);
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,并将在完成后更新我的答案。感谢您的工作,但在按住按钮的同时获得带有动作的按钮真的很复杂吗?--