当前位置: 首页 > 知识库问答 >
问题:

设定拇指焦点

王长卿
2023-03-14

我正在使用以下类创建一个垂直搜索栏

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

问题是我如何设置拇指按下和集中从代码绘图?

共有2个答案

向和歌
2023-03-14

从资源或以编程方式创建可绘制,并在完成后使用

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);
訾淇
2023-03-14

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面板。我不想添加滚动条作为滚动窗格的水平滚动条,因为我希望能够定位它。 我尝试在滚动条上设置模型并将其添加到面板(见代码),但这不起作用——拇指的大小不正确(它总是横跨整个轨道),定位也不正确。 如何将滚动条链接到文本区域,以便拇指大小和行为正确,并且仍然能够设置滚动条的位置和尺寸? 谢谢!