动态调整大小的SeekBar Thumb会在上方和下方被剪裁,如何在顶部绘制(Z顺序)?

时间:2014-02-15 19:05:36

标签: android android-studio android-ui

许多与拇指剪裁有关的stackoverflow问题都与左右剪裁有关,这与我的问题无关。

Thumb是一张图片。图像比例重置onProgressChanged,以便在SeekBar向右滑动时向上扩展。

问题在于,当图像变得足够高以触及SeekBar视图的顶部时,图像会继续缩放,同时保持顶部接触顶部。所以在视觉上看起来像拇指图像在页面上移动。

期望的是(1)当图像向右滑动时图像保持在条的中心。 (2)将拇指图像绘制在所有内容的顶部,而不是在SeekBar视图中剪切。

我尝试过使用SeekBar视图的bringToFront(),但它没有改变任何东西。

代码:

SeekBar.OnSeekBarChangeListener sbcl = new SeekBar.OnSeekBarChangeListener() {
                @Override
                public void onProgressChanged(SeekBar seekbar, int i, boolean b) {
                    Resources res = getResources();
                    int resID = (Integer)seekbar.getTag();
                  //  Log.i("R vals in Listener :"," "+resID);
                    Drawable thumb = res.getDrawable(resID);
                    double h = (double)thumb.getIntrinsicHeight();
                    double w = (double)thumb.getIntrinsicWidth();
                    double di = (double)i;
                    h = h * 0.2;  //scale for icons that are way to big
                    w = w * 0.2;
                    Log.i("seek 2"," h: "+h+" w: "+ w);
                    w = w * (di/200 + 0.5);
                    h = h * (di/200 + 0.5);
                    Log.i("seek 3"," h: "+h+" w: "+ w +" i: "+ i);
                    if (w<1) {w = 1;} if (h<1) {h = 1;}

                    Bitmap bmpOrg = ((BitmapDrawable)thumb).getBitmap();
                    Bitmap bmpScaled = Bitmap.createScaledBitmap(bmpOrg, (int)w, (int)h, true);
                    Drawable newThumb = new BitmapDrawable(res, bmpScaled);
                    newThumb.setBounds(0, 0, newThumb.getIntrinsicWidth(), newThumb.getIntrinsicHeight());
                    seekbar.setThumb(newThumb);
                }

.xml布局 maxHeight参数(android:maxHeight =“1000dp”)是一种解决方法,可以使图像在SeekBar上保持垂直居中

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingBottom="@dimen/activity_vertical_margin"
    tools:context="sic.emo.apptt.GetProtectorData$PlaceholderFragment">

    <sic.eco.appt.VerticalScrollView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:fillViewport="true"
        android:orientation="vertical"
        android:layout_weight="1">


            <LinearLayout
                android:orientation="vertical"
                android:layout_width="match_parent"
                android:layout_height="100dp">
              <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:textAppearance="?android:attr/textAppearanceLarge"
                    android:text="@string/LabelSA"
                android:layout_gravity="center"
                    android:id="@+id/textLabelSA" />
              <SeekBar
                android:layout_width="match_parent"
                android:layout_height="80dp"
                android:id="@+id/seekBarPS"
                android:thumb="@drawable/dog"
                android:maxHeight="1000dp"
                android:hapticFeedbackEnabled="true"
                android:layout_gravity="center_horizontal" />

            </LinearLayout>

            etc. etc.

1 个答案:

答案 0 :(得分:0)

(1)没有答案。使用image drawable为拇指,并动态缩放它,当它变大时,它的顶部与SeekBar视图的顶部对齐,所以不知道如何使它与众不同。如果有足够的屏幕空间,填充顶部将为图像增加提供更多空间。

(2)的答案是让元素叠加在一起,使用RelativeLayout来包含所有元素,而不是在LinearLayouts中保存每一行“of stuff”。裁剪来自单独的线性布局中的一行内容。

所以有一个包含所有东西的RelativeLayout,并使用Layout标签来定位所有内容:

                    android:layout_alignTop="@+id/textLabel1"
                    android:src="@drawable/ic_action_about"
                    android:layout_alignParentRight="false"
                    android:layout_alignParentLeft="true"
                    android:layout_alignParentEnd="false"
                    android:paddingLeft="0dp"
                    android:layout_marginLeft="-10dp"
                    android:layout_marginTop="-18dp"

在代码中,元素(在本例中为SeekBar,带有拇指图像)可以通过startTrackingTouch中的bringToFront()带到前面

 @Override
 public void onStartTrackingTouch(SeekBar seekBar) {
                    seekBar.bringToFront();
                }