2015-10-13 4 views
6

Ich benutze this basic wrapper um eine SeekBar herum, aber finde, dass es den Daumen versteckt, oder macht etwas Funky wie machen es weiß auf weißem Hintergrund, unter Marshmallow.Android 6.0 Marshmallow hört auf zu zeigen Vertical SeekBar thumb

Ich habe den AS "BlankActivity" -Assistenten verwendet, um ein Projekt zu erstellen, um dies zu illustrieren, wobei nichts außer den hier beschriebenen von den Standardeinstellungen geändert wird. Auf der linken Seite ist Lollipop, und der gleiche Code auf der rechten Seite unter Eibisch ausgeführt wird:

enter image description here

Es ist eine eigene horizontale SeekBar zu testen, ob es ein generelles Problem Customizing sie war, was es nicht ist. Die erste vertikale links hat keinen Stil, was ein guter Vor-Marshmallow ist, aber sonst nicht, die zentrale Explility verwendet den Widget.Material.Light.SeekBar Stil, um zu testen, ob der Standard irgendwie nicht aufgenommen wurde, und der das letzte gibt einen großen Hinweis, weil es den alten Widget.Holo.SeekBar Stil verwendet, wo es dann erscheint, obwohl es aussieht, als ob es vor ein paar Jahren herauskam.

Hier ist das Layout für diese:

<?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> 

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

und die 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

Dieser Fehler mit M arbeitet, ist * fast * in com.android.support:appcompat-v7:23.1.0 fixiert. Damit sieht der Daumen genauso aus wie der horizontale mit dem Code, wie er hier dargestellt wird, nur gibt es keine Animation, wenn er ausgewählt und bewegt wird (die groovige "Beule und sich ausdehnende Welle", die kurz von seinem Rand aufblitzt) Sehen Sie den langweiligen aber funktionalen Kreis. –

+1

mit appcompat-v7: 23.1.1 hier. Der Daumen ist auf Marshmallow völlig unsichtbar. Beendet die Erstellung eines benutzerdefinierten Thumbs, der gut funktioniert. – Matthias

Antwort

-1

einfach eine normale SeekBar verwenden und Android verwenden: Rotation =“ 270 "das hat mir geholfen.

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

Versuchen Sie diesen Code. Es funktioniert gut!

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

Es hilft mir auf Android 7.0 Nougat :) – elementstyle

+0

Mein Tag gerettet! Vielen Dank. –

+0

Ich habe keine Ahnung, wie du das herausgefunden hast, aber ja, es funktioniert ... Danke! – hlascelles

1

Ich verwende eine vertikale Seekbar auch und hatte das gleiche Problem. Dieser arbeitete für mich:

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

ich vor Eibisch die onPreDraw Anruf hatte bereits und nachdem es zeigt den Daumen gestoppt Ich habe eigentlich nur diesen Aufruf:

mSeekBar.setProgressAndThumb (45);

Und es fing auch an Marshmallow zu arbeiten. 45 ist nur der Fortschritt, auf den ich den Daumen setzen möchte, da meine Suchleiste einen maximalen Fortschritt von 90 hat, möchte ich, dass sie in der Mitte ist. Also musst du diese Nummer ändern, um deinen Fortschritt zu erreichen.

+0

Das ist, was ich gesucht habe! –

6

Es scheint, als ob das Marshmallow OS die Zeichnung auf der Leinwand irgendwie durchbrochen hat. Ich habe eine einfache Lösung implementiert.

I 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(); 
    } 
} 

bearbeiten eine Modifikation in zwei Methoden meiner custom made: Dies ist nur auf Eibisch Geräte funktionieren. Wenn Sie versuchen, dies auf Geräten zu verwenden, die vor M sind, zeigen sie zwei Daumen. Wenn Sie möchten, dass dies auf allen Geräten funktioniert, müssen Sie den Daumen vollständig neu zeichnen, indem Sie ein benutzerdefiniertes Attribut für den Daumen verwenden.

prüfen diese GitHub Repo für eine VerticalSeekBar die https://github.com/3drobotics/AndroidWidgets

+0

funktioniert, aber auf Fortschritt ändern Sie Fehler zur letzten Position ... –

+0

Funktioniert gut, verwenden Sie einfach: if (android.os.Build.VERSION.SDK_INT <= Build.VERSION_CODES.M) drawThumb (c); und funktioniert wie ein Charme, außer dass der Daumen auf dem Kopf steht. Ich habe dies mit einer neuen Version meines Daumens in den Ordner drawables-v24 behoben: