2013-09-02 3 views
7

Ich bin eine vertikale seekbar unter Verwendung der folgenden Klasse erstellenSet Daumen Fokus & gedrückt ziehbar auf benutzerdefinierten seekbar programmatisch

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

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

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

Und dann schaffen die seekbar der Tätigkeit

VerticalSeekBar myZoomBar = new VerticalSeekBar(this); 
Drawable drawable = getResources().getDrawable(R.drawable.green_bar); 
ClipDrawable clip = new ClipDrawable(drawable, Gravity.LEFT,ClipDrawable.HORIZONTAL); 
Drawable drawable2 = getResources().getDrawable(R.drawable.white_bar); 
InsetDrawable d1 = new InsetDrawable(drawable2, 5, 5, 5, 5); 
myZoomBar.setThumb(getResources().getDrawable(R.drawable.whitecircle)); 
LayerDrawable mylayer = new LayerDrawable(new Drawable[] { d1, clip }); 
myZoomBar.setProgressDrawable(mylayer); 
myZoomBar.setMax(100); 
myZoomBar.setProgress(50); 
LinearLayout.LayoutParams zoomBarParams = new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.MATCH_PARENT); 
zoomBarParams.gravity = Gravity.CENTER_HORIZONTAL; 
LinearLayout zoomLayout = new LinearLayout(this); 
zoomLayout.addView(myZoomBar, zoomBarParams); 
FrameLayout.LayoutParams frameLayoutParams = new FrameLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.MATCH_PARENT,Gravity.CENTER); 
addContentView(zoomLayout, frameLayoutParams); 

Die Frage besteht darin, wie setze ich den gedrückten und fokussierten Daumen aus dem Code?

+0

Ich sah Ihre Bearbeitung zu meiner Antwort. Als ich es akzeptieren wollte, lehnte jemand anderes es ab. Übrigens, sollte es nicht so bleiben, bis ACTION_UP angetroffen wird, da wir den auf acted_state in ACTION_DOWN abbildbaren Daum ändern? Wenn ACTION_MOVE erkannt wird, wird es nur nach ACTION_DOWN bereits aufgerufen (und der Daumendrücker wurde festgelegt). Ich nehme den Ablauf von Ereignissen an, während der Widerstand immer: ACTION_DOWN >> ACTION_MOVE >> ACTION_UP ist. Liege ich hier falsch? – Vikram

+0

Ja, aber ich benutze benutzerdefinierte Klasse, um eine vertikale Suchleiste zu zeichnen, wie Sie oben sehen können, also musste ich das einschließen :) –

Antwort

4

Hinzufügen eines OnTouchListener zu myZoomBar sollte Ihr Problem lösen. Legen Sie das Verhalten wie folgt aus:

myZoomBar.setOnTouchListener(new OnTouchListener() { 

    @Override 
    public boolean onTouch(View v, MotionEvent event) { 

     switch(event.getAction()) { 

     case MotionEvent.ACTION_DOWN: 
      // Pressed state 
      myZoomBar.setThumb(getResources().getDrawable(
          R.drawable.pressed_state)); 
      break; 

     case MotionEvent.ACTION_UP: 
      myZoomBar.setThumb(getResources().getDrawable(
          R.drawable.)); 
      break; 
     } 

     return false; 
    } 
}); 

Sie einen OnFocusChangeListener können Fokuswechsel zu handhaben, aber wenn alles, was Sie brauchen, den Daumen zu ändern ist, wenn eine Position auf dem SeekBar gedrückt wird, wird OnTouchListener genug sein.

In diesem Fall funktioniert der auswählbare Statusauswahlschalter möglicherweise nicht gut. Denn der Benutzer möchte möglicherweise zu einer Position springen, indem er darauf klickt (anstatt dorthin zu gleiten). Und ich glaube nicht, dass der Daumen mit Zustandsänderungen umgehen kann. Ich habe versucht, StateListDrawable zu verwenden, um ein Zeichen mit Zuständen zu erstellen, aber es mit myZoomBar.setThumb(stateDrawable) zu verwenden, hat nicht funktioniert.

1

erstellen Drawable von Ressourcen oder programmatisch und nach, wenn Sie es

verwenden getan
setThumb(your_drawable); 

Ich weiß nicht, ob es möglich ist, ziehbar mit Staaten (fokussiert und ausgewählt) programmatisch zu schaffen, sondern von xml:

<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item android:drawable="@drawable/state_focused" android:state_focused="true"> 
    <item android:drawable="@drawable/state_selected" android:state_selected="true"> 
    <item android:drawable="@drawable/state_normal"></item> 
</item></selector> 

und

getResources().getDrawable(R.drawable.your_drawable_id); 
+0

Ich habe bereits versucht, so, aber keinen Erfolg. –

+0

Hier ist etwas Interessantes [link] (http://stackoverflow.com/questions/16163215/android-styling-seek-bar) –

Verwandte Themen