2015-10-13 12 views
6

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:

enter image description here

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; 
    } 

} 
+0

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. –

+1

utilizzando appcompat-v7: 23.1.1 qui. Il pollice è completamente invisibile su marshmallow. Finito per creare un pollice personalizzato, che funziona bene. – Matthias

risposta

-1

Basta usare un SeekBar normale e utilizzare Android: Rotazione =" 270 "che mi ha aiutato.

<SeekBar 
android:id="@+id/seekBar" 
android:rotation="270" 
/> 
6

Prova questo codice. Funziona bene!

<seekBar> 
    ..... 
    android:splitTrack="false" 
</seekBar> 
+0

Mi aiuta su Android 7.0 Nougat :) – elementstyle

+0

Salvato la mia giornata! Grazie. –

+0

Non ho idea di come l'hai capito, ma sì, funziona ... Grazie! – hlascelles

1

Anche io uso una barra di ricerca verticale e ho avuto lo stesso problema. Questo ha funzionato per me:

In onCreate:

ViewTreeObserver vto = mSeekBar.getViewTreeObserver(); 
    vto.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() { 
     @Override 
     public boolean onPreDraw() { 
      Resources res = getResources(); 
      Drawable thumb_image = res.getDrawable(R.drawable.vertseekbarthumb); 
      int h = (int) (mSeekBar.getMeasuredWidth()); 
      int w = (int) (h); 
      Bitmap bmpOrg = ((BitmapDrawable) thumb_image).getBitmap(); 
      Bitmap bmpScaled = Bitmap.createScaledBitmap(bmpOrg, w, h, true); 
      mNewThumb = new BitmapDrawable(res, bmpScaled); 
      mNewThumb.setBounds(0, 0, mNewThumb.getIntrinsicWidth(), mNewThumb.getIntrinsicHeight()); 
      mSeekBar.setThumb(mNewThumb); 
      mSeekBar.getViewTreeObserver().removeOnPreDrawListener(this); 
      mSeekBar.setProgressAndThumb(45); 
      return true; 
     } 
    }); 

ho avuto la chiamata onPreDraw prima di marshmallow già e dopo si è fermato mostrando il pollice in realtà ho solo aggiunto questa chiamata:

mSeekBar.setProgressAndThumb (45);

E ha iniziato a lavorare anche su marsmallow. 45 è solo il progresso su cui voglio impostare il pollice, dato che il mio Seekbar ha un progresso massimo di 90 lo voglio nel mezzo. Quindi devi cambiare questo numero per abbinare i tuoi progressi.

+0

Questo è quello che stavo cercando! –

6

Sembra che il sistema operativo Marshmallow abbia in qualche modo rotto il disegno sulla tela. Ho implementato una soluzione semplice.

Ho fatto una modifica in due metodi di mia abitudine VerticalSeekBar

protected void onDraw(Canvas c) { 
    c.rotate(-90); 
    c.translate(-getHeight(), 0); 
    drawThumb(c); //redrawing thumb 

    super.onDraw(c); 
} 

void drawThumb(Canvas canvas) { 
    Drawable thumb = getThumb(); 
    if (thumb != null) { 
     Rect thumbBounds = thumb.getBounds(); 
     canvas.save(); 
     canvas.rotate(90, thumbBounds.exactCenterX(), thumbBounds.exactCenterY()); 
     thumb.draw(canvas); 
     canvas.restore(); 
    } 
} 

Edit: Questo funziona solo su dispositivi Marshmallow. Se si tenta di utilizzare questo dispositivo su dispositivi pre M, mostreranno due pollici. Se si desidera che funzioni su tutti i dispositivi, sarà necessario ridisegnare completamente il pollice utilizzando un attributo personalizzato per il pollice.

Scegli questa GitHub repo per un VerticalSeekBar che funziona con M https://github.com/3drobotics/AndroidWidgets

+0

funziona, ma in progresso cambia bug in ultima posizione ... –

+0

Funziona alla grande, basta usare: if (android.os.Build.VERSION.SDK_INT <= Build.VERSION_CODES.M) drawThumb (c); e funzionerà come un incantesimo, a parte il fatto che il pollice sarà capovolto. Ho risolto questo problema con una nuova versione del mio pollice nella cartella drawables-v24: