2013-09-02 9 views
7

मैंसेट अंगूठे फोकस और कस्टम 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); 
    } 

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

और फिर

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

का उपयोग कर सवाल यह है कि है गतिविधि में seekbar बनाने निम्नलिखित वर्ग का उपयोग कर एक ऊर्ध्वाधर seekbar बनाने रहा हूँ पर दबाया drawable क्या मैं अंगूठे दबाया और कोड से आकर्षित करने योग्य ध्यान केंद्रित करूँ?

+0

मैंने आपके जवाब में आपका संपादन देखा। जब तक मैं इसे स्वीकार करने जा रहा था, किसी और ने इसे खारिज कर दिया। वैसे, चूंकि हम ACTION_DOWN पर pressed_state पर खींचने वाले अंगूठे को बदल रहे हैं, तो क्या यह ACTION_UP का सामना नहीं होने तक इस तरह से नहीं रहना चाहिए? यदि ACTION_MOVE का पता चला है, तो यह केवल ACTION_DOWN को पहले ही कॉल कर दिया जाएगा (और अंगूठे को खींचने योग्य सेट किया गया है)। ड्रैग हमेशा होता है, जबकि मैं घटनाओं का प्रवाह मान रहा हूं: ACTION_DOWN >> ACTION_MOVE >> ACTION_UP। क्या मैं यहाँ गलत हूँ? – Vikram

+0

हां, लेकिन मैं उपरोक्त देख सकने के लिए एक लंबवत खोजबार खींचने के लिए कस्टम क्लास का उपयोग कर रहा हूं, इसलिए मुझे इसे शामिल करना था :) –

उत्तर

4

एक OnTouchListener 01 को जोड़नाआपकी समस्या का समाधान करना चाहिए। इस तरह अपने व्यवहार सेट करें:

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

आप ध्यान में परिवर्तन को संभालने के लिए एक OnFocusChangeListener उपयोग कर सकते हैं, लेकिन अगर आप सभी की जरूरत है जब seekbar पर एक स्थान से दबाया जाता है अंगूठे बदलने के लिए है, OnTouchListener पर्याप्त होगा।

राज्य चयनकर्ता आकर्षित करने योग्य इस मामले में अच्छी तरह से काम नहीं कर सकता है। क्योंकि, उपयोगकर्ता उस पर क्लिक करके स्थिति में कूदना चाहता है (वहां स्लाइडिंग के बजाए)। और मुझे नहीं लगता कि अंगूठे राज्य परिवर्तनों को संभाल सकता है। मैंने राज्यों के साथ आकर्षित करने के लिए StateListDrawable का उपयोग करने का प्रयास किया, लेकिन myZoomBar.setThumb(stateDrawable) के साथ इसका उपयोग नहीं किया।

1

संसाधनों या प्रोग्राम के रूप से और बाद Drawable बनाएं जब आप इसे

setThumb(your_drawable); 

का उपयोग मैं नहीं जानता कि अगर वहाँ संभव है राज्यों के साथ drawable बनाने के लिए किया (केंद्रित और चयनित) प्रोग्राम के रूप में लेकिन एक्सएमएल से:

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

और

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

मैंने पहले से ही ऐसा करने की कोशिश की है, लेकिन कोई सफलता नहीं है। –

+0

यहां कुछ दिलचस्प है [लिंक] (http://stackoverflow.com/questions/16163215/android-styling-seek-bar) –

संबंधित मुद्दे