SeekBar.setProgress不会更新视图

时间:2014-12-09 20:09:21

标签: android seekbar

我正在尝试制作一个带有两个可以同时控制的搜索栏的Android应用程序(多点触控)。完整的源代码可以找到here

该应用程序是一个机器人控制器,每个搜索栏控制一个电机,以便向前移动你向上滑动两个杆等(速度由你向上或向下推动的距离控制)50其中停止状态,100是最大前进速度,0是最大速度后退。

我想要实现的是,在你放开搜索栏之后,它将返回到停止状态(进度50),但是,即使该值实际设置为50(使用setProgress)但是观点不会更新以反映这一点。 我尝试使用.invalidate().requestLayout()和一些旧解决方案herehere,但无法使用它。

以下是代码的一部分:(完整代码检查上面的github链接)

public class MainActivity extends ActionBarActivity {
    ...

    ...
    public static void ResetSeekBar(View v) {
        if ( v.getId() == R.id.sb1) {
            Log.d("before", "Progress = " + Integer.toString(sb1.getProgress()));
            sb1.setProgress(50);
            Log.d("after", "Progress = " + Integer.toString(sb1.getProgress()));
            sb1.invalidate();
            //sb1.requestLayout();

        } else if ( v.getId() == R.id.sb2) {
            sb2.setProgress(50);

        }
    }
}


public class MySeekBar extends SeekBar {
    public MySeekBar(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public boolean onTouchEvent(final MotionEvent event) {
        if (event.getAction() == MotionEvent.ACTION_UP) {
            Log.d("tag", "UP");
            MainActivity.ResetSeekBar(this);
        } else if (event.getAction() == MotionEvent.ACTION_MOVE) {
            Log.d("tag", Integer.toString(getProgress()));
            MainActivity.UpdateText(this, Integer.toString(getProgress()));
        } else if (event.getAction() == MotionEvent.ACTION_DOWN) {
            Log.d("tag", "DOWN ");
            MainActivity.UpdateText(this, Integer.toString(getProgress()));
        }
        return super.onTouchEvent(event);
    }
}

使用onClick上的常规按钮可以更新视图,但不能在MotionEvent之后更新。那么我做错了什么?

另外,如何将其重置为50但快速转换而不是突然跳到中间?

1 个答案:

答案 0 :(得分:0)

当然,解决问题的方法是你问人!无论如何,它比我想象的要简单得多。

在处理事件之前应该调用

super.onTouchEvent(event),我想我在实际处理更改之前尝试更改它,所以它覆盖了我的所作所为! (不确定只是根据我看到的行为进行猜测)

以下是修复后的函数:

public boolean onTouchEvent(final MotionEvent event) {
    super.onTouchEvent(event);
    if (event.getAction() == MotionEvent.ACTION_UP) {
        Log.d("tag", "UP");
        MainActivity.ResetSeekBar(this);
    } else if (event.getAction() == MotionEvent.ACTION_MOVE) {
        Log.d("tag", Integer.toString(getProgress()));
        MainActivity.UpdateText(this, Integer.toString(getProgress()));
    } else if (event.getAction() == MotionEvent.ACTION_DOWN) {
        Log.d("tag", "DOWN ");
        MainActivity.UpdateText(this, Integer.toString(getProgress()));
    }
    return true;
}