我正在使用以下类创建一个垂直搜索栏
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);
问题是我如何设置拇指按下和集中从代码绘图?
从资源或以编程方式创建可绘制,并在完成后使用
setThumb(your_drawable);
我不知道是否有可能通过编程方式创建具有状态(聚焦和选中)的drawable,但可以使用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);
将OnTouchListener
添加到myZoomBar
可以解决您的问题。将其行为设置为:
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
来处理焦点的更改,但是如果您只需要在按下搜索杆上的某个位置时更改拇指,那么OnTouchListener就足够了。
在这种情况下,状态选择器可绘制可能无法正常工作。因为,用户可能希望通过点击它(而不是在那里滑动)跳转到一个位置。我不认为拇指能处理状态变化。我尝试使用StateListDrawable
来创建一个带有状态的绘图,但是使用myZoomBar.setThumb(stateDrawable)
不起作用。
我设置了滑块的最小值和最大值(例如从1..100开始)。但我有另一个控件,它限制滑块的值范围,比如说从30..60。现在用户应该无法将滑块拇指移动到30以下和60以上,但最小值和最大值仍然应该是1和100。
在Android系统中,是否可能有一个开关,可以为拇指的选中和未选中状态设置不同的图像? 例如,当开关处于未选中状态时,我希望拇指使用image_1。png当开关处于选中状态时,我希望拇指使用image_2。png。 我使用以下指南将开关的拇指设置为图像,但该图像适用于选中和未选中状态,我希望两种状态都有一个单独的图像。 谢谢
这是我的seekbar: 这是我的拇指。xml: 这是我的定制搜索栏。xml: 这是我的搜索棒。巴布亚新几内亚(背景): 酒吧里没有阴影,也没有圆边。。。 我真的不明白我该怎么做。
我想改变它的颜色拇指像这样...:(我知道如何改变背景进度颜色,但不是拇指颜色)... 有没有办法用java代码实现这一点?提前谢谢!!
我已经创建了一个JScrollbar(具有自定义UI)和一个JTextArea在JScrollPane中的J面板。我不想添加滚动条作为滚动窗格的水平滚动条,因为我希望能够定位它。 我尝试在滚动条上设置模型并将其添加到面板(见代码),但这不起作用——拇指的大小不正确(它总是横跨整个轨道),定位也不正确。 如何将滚动条链接到文本区域,以便拇指大小和行为正确,并且仍然能够设置滚动条的位置和尺寸? 谢谢!