2013-09-02 27 views
7

tôi đang tạo ra một seekbar dọc bằng cách sử dụng lớp sauSet thumb tập trung & drawable ép vào tùy chỉnh seekbar lập trình

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

Và sau đó tạo ra các seekbar trong hoạt động sử dụng

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

Câu hỏi đặt ra là làm sao thế nào để tôi thiết lập ngón tay cái ép và tập trung drawable từ mã?

+0

Tôi đã thấy bản chỉnh sửa của bạn cho câu trả lời của tôi. Đến lúc tôi chấp nhận nó, một người khác đã từ chối nó. Nhân tiện, vì chúng tôi đang thay đổi ngón tay cái có thể vẽ thành press_state trên ACTION_DOWN, nên không nên giữ nguyên cách này cho đến khi gặp ACTION_UP? Nếu ACTION_MOVE được phát hiện, nó sẽ chỉ sau khi ACTION_DOWN đã được gọi (và ngón tay cái có thể vẽ được thiết lập). Tôi giả sử luồng sự kiện trong khi kéo luôn là: ACTION_DOWN >> ACTION_MOVE >> ACTION_UP. Tôi có sai ở đây không? – Vikram

+0

Có, nhưng tôi đang sử dụng lớp tùy chỉnh để vẽ một thanh tìm kiếm dọc như bạn có thể thấy ở trên, vì vậy tôi phải bao gồm điều đó :) –

Trả lời

4

Thêm một OnTouchListener-myZoomBar sẽ giải quyết vấn đề của bạn. Đặt hành vi của nó như thế này:

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

Bạn có thể sử dụng một OnFocusChangeListener để xử lý sự thay đổi trong tập trung, nhưng nếu tất cả bạn cần là thay đổi ngón tay cái khi một vị trí trên SeekBar được nhấn, OnTouchListener sẽ là đủ.

Công cụ chọn bộ chọn trạng thái có thể không hoạt động tốt trong trường hợp này. Bởi vì, người dùng có thể muốn chuyển đến một vị trí bằng cách nhấp vào nó (thay vì trượt ở đó). Và tôi không nghĩ rằng ngón tay cái có thể xử lý các thay đổi trạng thái. Tôi đã thử sử dụng StateListDrawable để tạo ra một drawable với các tiểu bang, nhưng sử dụng nó với myZoomBar.setThumb(stateDrawable) không hoạt động.

1

Tạo drawable từ nguồn hoặc theo trình tự và sau khi bạn thực hiện nó sử dụng

setThumb(your_drawable); 

Tôi không biết nếu có thể tạo ra drawable với các quốc gia (tập trung và chọn) theo chương trình nhưng từ 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> 

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

Tôi đã thử làm theo cách đó, nhưng không thành công. –

+0

Đây là một điều thú vị [link] (http://stackoverflow.com/questions/16163215/android-styling-seek-bar) –

Các vấn đề liên quan