Sto usando this basic wrapper attorno a SeekBar ma trovo che nasconde il pollice o fa qualcosa di funky come renderlo bianco su uno sfondo bianco, sotto Marshmallow.Android 6.0 Marshmallow si interrompe mostrando Vertical SeekBar thumb
Ho utilizzato la procedura guidata AS "BlankActivity" per creare un progetto per illustrare ciò, non cambiando nulla eccetto ciò che è descritto qui, dai valori predefiniti. Sulla sinistra è Lollipop, e lo stesso codice è in esecuzione sul proprio sotto Marshmallow:
C'è un SeekBar orizzontale personalizzato per verificare se ci fosse un problema generale di loro personalizzazione, che non c'è. Il primo verticale a sinistra non ha uno stile, che è bene pre-Marshmallow ma non altrimenti, quello centrale utilizza lo stile Widget.Material.Light.SeekBar per verificare se il valore predefinito non è stato prelevato, e il l'ultimo dà un grande indizio perché usa il vecchio stile Widget.Holo.SeekBar in cui appare quindi, anche se sembra uscito qualche anno fa.
Ecco il layout per questo:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin"
tools:context=".MainActivity"
>
<com.otamate.seekbarmarshbug.CustomSeekBar
android:id="@+id/seekBarCustom"
android:layout_width="match_parent"
android:layout_height="wrap_content"
/>
<com.otamate.seekbarmarshbug.VerticalSeekBar
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_below="@+id/seekBarCustom"
/>
<com.otamate.seekbarmarshbug.VerticalSeekBar
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:gravity="center_horizontal"
android:layout_below="@+id/seekBarCustom"
android:layout_centerHorizontal="true"
style="@android:style/Widget.Material.Light.SeekBar"
/>
<com.otamate.seekbarmarshbug.VerticalSeekBar
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_alignParentRight="true"
android:layout_below="@+id/seekBarCustom"
style="@android:style/Widget.Holo.SeekBar"
/>
</RelativeLayout>
Il CustomSeekBar:
package com.otamate.seekbarmarshbug;
import android.content.Context;
import android.util.AttributeSet;
import android.widget.SeekBar;
public class CustomSeekBar extends SeekBar {
public CustomSeekBar(Context context) {
super(context);
}
public CustomSeekBar(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
public CustomSeekBar(Context context, AttributeSet attrs) {
super(context, attrs);
}
}
e la VerticalSeekBar:
package com.otamate.seekbarmarshbug;
import android.content.Context;
import android.graphics.Canvas;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.widget.SeekBar;
public class VerticalSeekBar extends SeekBar {
public VerticalSeekBar(Context context) {
super(context);
}
public VerticalSeekBar(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
public VerticalSeekBar(Context context, AttributeSet attrs) {
super(context, attrs);
}
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(h, w, oldh, oldw);
}
@Override
protected synchronized void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(heightMeasureSpec, widthMeasureSpec);
setMeasuredDimension(getMeasuredHeight(), getMeasuredWidth());
}
protected void onDraw(Canvas c) {
c.rotate(-90);
c.translate(-getHeight(), 0);
super.onDraw(c);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
if (!isEnabled()) {
return false;
}
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
case MotionEvent.ACTION_MOVE:
case MotionEvent.ACTION_UP:
setProgress(getMax() - (int) (getMax() * event.getY()/getHeight()));
onSizeChanged(getWidth(), getHeight(), 0, 0);
break;
case MotionEvent.ACTION_CANCEL:
break;
}
return true;
}
}
Questo bug è * quasi * fissato in com.android.support:appcompat-v7:23.1.0. Usando questo, il pollice sembra uguale a quello orizzontale con il codice presentato qui, eccetto che non c'è animazione quando è selezionato e spostato (il groovy "rigonfiamento ed espansione" che lampeggia brevemente dal suo bordo), basta vedere il cerchio noioso ma funzionale. –
utilizzando appcompat-v7: 23.1.1 qui. Il pollice è completamente invisibile su marshmallow. Finito per creare un pollice personalizzato, che funziona bene. – Matthias