2013-09-02 13 views
7

tworzę pionową SeekBar stosując następujące klasyUstaw kciuk ostrości i naciśnięciu odkształcalne na zwyczaj SeekBar programowo

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

a następnie utworzyć SeekBar w działalności używając

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

Pytanie brzmi, jak czy ustawiam kciuk wciśnięty i skupiam się do rysowania z kodu?

+0

Widziałem twoją odpowiedź w mojej odpowiedzi. Zanim miałem zamiar to zaakceptować, ktoś inny odrzucił to. A przy okazji, skoro zmieniamy rysowanie kciukiem na przycisk ACTION_DOWN, to czy nie powinno tak pozostać do czasu napotkania ACTION_UP? Jeśli zostanie wykryte ACTION_MOVE, zostanie ono już tylko po wywołaniu ACTION_DOWN (i ustawiona jest możliwość losowania kciuka). Zakładam przepływ zdarzeń, podczas gdy opór jest zawsze: ACTION_DOWN >> ACTION_MOVE >> ACTION_UP. Czy ja tu się mylę? – Vikram

+0

Tak, ale używam klasy niestandardowej, aby narysować pionowy pasek wyszukiwania, jak widać powyżej, więc musiałem to uwzględnić :) –

Odpowiedz

4

Dodawanie OnTouchListener do myZoomBar powinien rozwiązać twój problem. Ustawić jego zachowanie tak:

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

Można użyć OnFocusChangeListener obsłużyć zmianę ostrości, ale jeśli wszystko, co potrzebne jest, aby zmienić kciuk gdy pozycja na SeekBar naciśnięciu OnTouchListener będzie wystarczające.

Szuflada selektora stanu może w tym przypadku nie działać poprawnie. Ponieważ użytkownik może chcieć przeskoczyć do pozycji, klikając na nią (zamiast przesuwać się tam). I nie sądzę, by kciuk poradził sobie ze zmianami stanu. Próbowałem użyć StateListDrawable, aby utworzyć wyciągany ze stanami, ale używanie go z myZoomBar.setThumb(stateDrawable) nie działa.

1

Tworzenie rozciągliwej z zasobów lub programowo i po kiedy zrobić to użyć

setThumb(your_drawable); 

Nie wiem, czy istnieje możliwość stworzenia rozciągliwej ze stanów (ostrość i wybrane) programowo, ale z 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> 

i

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

Próbowałem już to zrobić, ale bez powodzenia. –

+0

Oto coś interesującego [link] (http://stackoverflow.com/questions/16163215/android-styling-seek-bar) –

Powiązane problemy