Adjust thumb focus and click on custom search bar programmatically

I create a vertical search bar using the following class

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

And then create an arrow in action using

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

The question is, how can I press my thumb and focus the selection from the code?

+7
android android-layout
source share
2 answers

Adding OnTouchListener to myZoomBar should solve your problem. Define its behavior as follows:

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

You can use OnFocusChangeListener to handle focus changes, but if you only need to change your finger when the position on the SeekBar is pressed, OnTouchListener will be enough.

The selector selector may not work in this case. Because the user may want to go to the position by clicking on it (rather than sliding there). And I don’t think the thumb can handle state changes. I tried using StateListDrawable to create a drawable with states, but using it with myZoomBar.setThumb(stateDrawable) did not help.

+4
source share

Create Drawable from resources or programmatically, and after you have done this, use

 setThumb(your_drawable); 

I don't know if it is possible to create drawable with states (focused and selected) programmatically, but from 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> 

and

 getResources().getDrawable(R.drawable.your_drawable_id); 
+1
source share

All Articles