我的主要和次要进展在同一时间增长,次要进展比主要增长更快。 每次我更新主要进度时,次要进度都会丢失(比如它将为零或小于主要进度)。这会产生令人讨厌的闪烁。
我找到的唯一解决方法是在设置主要设置后将辅助设置为自身。我添加了#34; + 1"因为SeekBar有一个检查,如果我设置相同的值,则不会重绘。
mSeekBar.setProgress(newPosition);
mSeekBar.setSecondaryProgress(mSeekBar.getSecondaryProgress()+1); // WTF?
第二行可能会修复它,但它看起来很荒谬,我觉得效率也很低。
这发生在Lollipop(5.0.1) - API 21上。 它以前工作得很好 - 无法找出原因。
如果我为API级别19构建它可以正常工作。 (视频:API19Seekbar)
targetSdkVersion 19
compile 'com.android.support:appcompat-v7:19.+'
如果我为API级别21构建,它会闪烁。 (视频:API21SeekBar)
targetSdkVersion 21
compile 'com.android.support:appcompat-v7:21.+'
完整示例活动代码如下:
int delay1 = 1000;
int delay2 = 200;
int primaryProgress;
int secondaryProgress;
boolean mStarted;
Button mButton;
SeekBar mSeekBar;
Handler h1 = new Handler();
Handler h2 = new Handler();
Runnable primary = new Runnable() {
@Override
public void run() {
primaryProgress = (primaryProgress + 1) % 100;
mSeekBar.setProgress(primaryProgress);
h1.postDelayed(primary, delay1);
}
};
Runnable secondary = new Runnable() {
@Override
public void run() {
secondaryProgress = (secondaryProgress + 1) % 100;
mSeekBar.setSecondaryProgress(secondaryProgress);
h2.postDelayed(secondary, delay2);
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mButton = (Button)findViewById(R.id.button);
mButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
buttonClick();
}
});
mSeekBar = (SeekBar)findViewById(R.id.seekBar);
}
private void buttonClick() {
mStarted = !mStarted;
if (mStarted) {
mButton.setText("Started");
h1.postDelayed(primary, delay1);
h2.postDelayed(secondary, delay2);
} else {
mButton.setText("Stopped");
h1.removeCallbacks(primary);
h2.removeCallbacks(secondary);
}
}
答案 0 :(得分:2)
这已针对下一个Android版本修复,但目前最好的解决方法可能是从SDK资源(scrubber_progress_horizontal_material.xml
)复制<sdk-root>/platforms/android-21/data/res/...
及其9补丁PNG,然后重新排列标记,以便<layer-list>
位于根目录。
修改后的XML应该是这样的:
可绘制-V21 / scrubber_progress_horizontal_material_fixed.xml
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@android:id/background">
<nine-patch
android:src="@drawable/scrubber_track_mtrl_alpha"
android:tint="?android:attr/colorControlNormal" />
</item>
<item android:id="@android:id/secondaryProgress">
<scale android:scaleWidth="100%">
<selector>
<item android:state_enabled="false">
<color android:color="@android:color/transparent" />
</item>
<item>
<nine-patch
android:src="@drawable/scrubber_primary_mtrl_alpha"
android:tint="?android:attr/colorControlNormal" />
</item>
</selector>
</scale>
</item>
<item android:id="@android:id/progress">
<scale android:scaleWidth="100%">
<selector>
<item android:state_enabled="false">
<color android:color="@android:color/transparent" />
</item>
<item>
<nine-patch
android:src="@drawable/scrubber_primary_mtrl_alpha"
android:tint="?android:attr/colorControlActivated" />
</item>
</selector>
</scale>
</item>
</layer-list>
然后values-v21/styles.xml
和/或您的布局XML中的相应更改,以便您在API 21+上默认使用此背景。如果你需要,我可以提供一些例子。