【问题标题】:Update ProgressBar onTouch and restart it on release (with imageButton)更新 ProgressBar onTouch 并在发布时重新启动它(使用 imageButton)
【发布时间】:2016-02-07 23:18:43
【问题描述】:

我正在尝试实现以下设计/功能:我有一个被圆形进度条包围的圆形图像。我希望当用户触摸 imageButton 时,进度条会像这样开始它的进度:

问题在于,当用户决定将手指从图像按钮 (MotionEvent.ACTION_UP) 移开时,进度条不会停止并返回其初始状态 (0)。

这是我的代码:

public class MainActivity extends AppCompatActivity {
public CircleProgressBar progressBar;
private static final String TAG = MainActivity.class.getSimpleName();
private int totalProgressTime = 100;
Thread t;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);
    progressBar = (CircleProgressBar)findViewById(R.id.custom_progressBar);
    t = new Thread() {
        @Override
        public void run() {
            int jumpTime = 0;

            while(jumpTime < totalProgressTime) {
                try {
                    sleep(200);
                    jumpTime += 5;
                    final int finalJumpTime = jumpTime;
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            progressBar.setProgress(finalJumpTime);
                        }
                    });
                }
                catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }
    };

    ImageButton imageButton = (ImageButton)findViewById(R.id.imageButton);
    imageButton.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            if(event.getAction() == MotionEvent.ACTION_DOWN) {
                if(!t.isAlive()){
                    t.start();
                }else {
                    t.stop();
                }
                Toast.makeText(MainActivity.this, "onTouch", Toast.LENGTH_LONG).show();
            }

            if(event.getAction() == MotionEvent.ACTION_UP){
                t.interrupt();
            }

            Log.d(TAG, "Event type: " + event.toString());
            return false;
        }
    });

}

【问题讨论】:

  • 抱歉,我没有完全理解您的需求。进度条在 ACTION_UP 上停止并返回其初始状态是否是有问题的或期望的行为?
  • 哦,对不起,我应该更清楚。这是所需的行为。我希望当用户在进度条达到 100 之前执行 ACTION_UP 时自行重置。

标签: android progress-bar


【解决方案1】:

我认为您误解了如何使用线程。最重要的是,您不应该在 Android 中真正使用这样的线程。从活动中启动线程几乎是不可取的(如果您来自 Java 背景并且正在学习 Android,则很容易出错;我也做过同样的事情)。另外,请阅读 Thread.stop 的 javadoc。你永远不应该调用那个方法。

您可能想要做的是学习如何使用Handler 来安排一小部分工作以某个时间间隔在主线程上运行。继续安排新的位来执行你想要的渲染,直到某些东西设置一个标志告诉它不再安排那个位。您将解决您的问题,而无需使用单独的线程。

【讨论】:

  • 非常感谢@Daug Stevenson,我使用 AsynkTask 解决了我的问题。你认为这是一个更好的主意吗?
  • AsyncTask 将其工作安排在另一个线程上。我认为在您的情况下,任何工作都不需要使用不同的线程。您尝试做的工作只需要在主线程上按时间间隔安排,这就是 Handler 可以为您做的事情。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-10-04
  • 1970-01-01
  • 2018-12-24
  • 1970-01-01
  • 1970-01-01
  • 2018-07-01
  • 1970-01-01
相关资源
最近更新 更多