【问题标题】:How to create custom spinner like border around the spinner with down triangle on the right side?如何在微调器周围创建自定义微调器,如右侧向下三角形的边框?
【发布时间】:2013-06-18 08:59:51
【问题描述】:

我想开发自定义微调器,例如在右下角带有三角形的微调器周围的线。
如下图

对于上面的图,我写了我的自定义微调器,就像一个

spinner.xml

 <Spinner android:background="@drawable/spinner_background"/>

spinner_background.xml

<?xml version="1.0" encoding="UTF-8"?>

<item android:state_pressed="true"
      android:drawable="@drawable/spinner_ab_pressed_new_theme_bs">
    <shape>

        <solid 
            android:color="@color/White" />

        <corners android:radius="3dp" />

        <padding 
            android:bottom="10dp" 
            android:left="10dp" 
            android:right="10dp" 
            android:top="10dp" />

         <stroke 
            android:width="2dp" 
            android:color="@color/skyblue" />
    </shape>
 </item>
 <!-- spinner_ab_default_new_theme_bs -> this image for corner triangle -->
<item

    android:drawable="@drawable/spinner_ab_default_new_theme_bs" >
    <shape>
        <solid
            android:color="@color/White">
        </solid>

        <corners android:radius="3dp" />

        <padding
            android:bottom="10dp" 
            android:left="10dp" 
            android:right="10dp" 
            android:top="10dp" />
         <stroke 
            android:width="2dp" 
            android:color="@color/gray"/>
    </shape>
</item>

我得到了如下图的输出

我尝试了很多但没有达到我的目标请任何人有解决方案来开发微调器。
就像上面的第一张图片。

【问题讨论】:

    标签: android android-layout


    【解决方案1】:

    微调器

    <Spinner
        android:id="@+id/To_Units"
        style="@style/spinner_style" />
    

    style.xml

        <style name="spinner_style">
              <item name="android:layout_width">match_parent</item>
              <item name="android:layout_height">wrap_content</item>
              <item name="android:background">@drawable/gradient_spinner</item>
              <item name="android:layout_margin">10dp</item>
              <item name="android:paddingLeft">8dp</item>
              <item name="android:paddingRight">20dp</item>
              <item name="android:paddingTop">5dp</item>
              <item name="android:paddingBottom">5dp</item>
              <item name="android:popupBackground">#DFFFFFFF</item>
         </style>
    

    gradient_spinner.xml(在可绘制文件夹中)

    <?xml version="1.0" encoding="utf-8"?>
    <selector xmlns:android="http://schemas.android.com/apk/res/android">
    
        <item><layer-list>
                <item><shape>
                        <gradient android:angle="90" android:endColor="#B3BBCC" android:startColor="#E8EBEF" android:type="linear" />
    
                        <stroke android:width="1dp" android:color="#000000" />
    
                        <corners android:radius="4dp" />
    
                        <padding android:bottom="3dp" android:left="3dp" android:right="3dp" android:top="3dp" />
                    </shape></item>
                <item ><bitmap android:gravity="bottom|right" android:src="@drawable/spinner_arrow" />
                </item>
            </layer-list></item>
    
    </selector>  
    

    @drawable/spinner_arrow是你的右下角图片

    【讨论】:

    • 我想问的问题是当按下微调器时,选择器颜色应该改变意味着改变样式。你有什么想法吗?
    • 什么是fillWidth_wrapHeight 是不是另一种风格?
    • @SatanEnglish 我猜这是不包括在内的预定义样式。它可能定义了layout_widthlayout_height 属性并将它们分别设置为match_parent(而不是已弃用的fill_parent)和wrap_content
    • 当我的文本太长时,它会与微调箭头重叠。有什么避免这种情况的建议吗?
    • @SatanEnglish 这是我重新设计并合并到 spinner_style 中的另一种风格
    【解决方案2】:

    这是一个简单的。

    your_layout.xml

    <android.support.v7.widget.AppCompatSpinner
      android:layout_width="match_parent"
      android:layout_height="wrap_content"
      android:background="@drawable/spinner_background"
    />
    

    在drawable文件夹中,spinner_background.xml

    <?xml version="1.0" encoding="utf-8"?>
    <selector xmlns:android="http://schemas.android.com/apk/res/android">
      <item><layer-list>
        <item>
            <shape>
                <solid
                    android:color="@color/colorWhite">
                </solid>
    
                <corners android:radius="3dp" />
    
                <padding
                    android:bottom="10dp"
                    android:left="10dp"
                    android:right="10dp"
                    android:top="10dp" />
                <stroke
                    android:width="2dp"
                    android:color="@color/colorDarkGrey"/>
            </shape>
        </item>
        <item >
            <bitmap android:gravity="bottom|right"
            android:src="@drawable/ic_arrow_drop_down_black_24dp" />
        </item>
      </layer-list></item>
    </selector>
    

    预览:

    【讨论】:

    • ic_arrow_drop_down_black_24dp 这个矢量可以绘制吗?
    • @RaviYadav,而不是 bitmap,您可以放置​​矢量可绘制对象:&lt;item android:drawable="@drawable/ic_arrow_drop_down_black_24dp" android:gravity="right"&gt; &lt;/item&gt;
    【解决方案3】:

    您可以通过在 XML 中的微调器声明中使用单行来实现以下目的:

    只需添加:style="@android:style/Widget.Holo.Light.Spinner"

    这是 android 中默认生成的样式。但它不包含它周围的边界。为此,您最好在 google 上搜索一些内容。

    希望这会有所帮助。

    更新: 经过大量挖掘后,我得到了一些非常适合在微调器周围引入边框的东西。

    <?xml version="1.0" encoding="utf-8"?>
    <layer-list xmlns:android="http://schemas.android.com/apk/res/android">
        <item
            android:bottom="8dp"
            android:top="8dp">
            <shape>
                <solid android:color="@android:color/white" />
                <corners android:radius="4dp" />
                <stroke
                    android:width="2dp"
                    android:color="#9E9E9E" />
                <padding
                    android:bottom="16dp"
                    android:left="8dp"
                    android:right="16dp"
                    android:top="16dp" />
            </shape>
        </item>
    </layer-list>
    

    将它放在可绘制文件夹中,并将其用作微调器的背景。像这样:

    <RelativeLayout
            android:id="@+id/speaker_relative_layout"
            android:layout_width="0dp"
            android:layout_height="70dp"
            android:layout_marginEnd="8dp"
            android:layout_marginLeft="8dp"
            android:layout_marginRight="8dp"
            android:layout_marginStart="8dp"
            android:layout_marginTop="16dp"
            android:background="@drawable/spinner_style"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintTop_toTopOf="parent">
    
            <Spinner
                android:id="@+id/select_speaker_spinner"
                style="@style/Widget.AppCompat.DropDownItem.Spinner"
                android:layout_width="match_parent"
                android:layout_height="70dp"
                android:entries="@array/select_speaker_spinner_array"
                android:spinnerMode="dialog" />
    
        </RelativeLayout>
    

    【讨论】:

    • Karan Thakkar说的默认样式也很好,我用的是这个默认样式:style="@android:style/Widget.Spinner",还有很多其他的,试试看。
    【解决方案4】:

    有两种方法可以实现这一点。

    1- 正如已经提出的,您可以将微调器的背景设置为自定义 9 补丁图像,并对其进行所有调整。

    android:background="@drawable/btn_dropdown" 
    android:clickable="true"
    android:dropDownVerticalOffset="-10dip"
    android:dropDownHorizontalOffset="0dip"
    android:gravity="center"
    

    如果您希望您的微调器显示各种不同的背景颜色,我建议您将下拉图像设置为透明,并在设置颜色的相对布局中加载该微调器。

    btn _dropdown 为:

    <selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:state_window_focused="false" android:state_enabled="true"
        android:drawable="@drawable/spinner_default" />
    <item
        android:state_window_focused="false" android:state_enabled="false"
        android:drawable="@drawable/spinner_default" />
    <item
        android:state_pressed="true"
        android:drawable="@drawable/spinner_pressed" />
    <item
        android:state_focused="true" android:state_enabled="true"
        android:drawable="@drawable/spinner_pressed" />
    <item
        android:state_enabled="true"
        android:drawable="@drawable/spinner_default" />
    <item
        android:state_focused="true"
        android:drawable="@drawable/spinner_pressed" />
    <item
        android:drawable="@drawable/spinner_default" />
    </selector>
    

    png 的各种状态将定义您的微调器 seleti 的各种状态

    【讨论】:

      【解决方案5】:

      要仅更改“背景”(添加角,更改颜色,...),您可以将其放入 FrameLayout 中并带有想要的背景可绘制,否则您需要制作九个补丁背景以不丢失微调箭头。微调器背景是透明的。

      【讨论】:

        【解决方案6】:

        如果您不喜欢创建多个 XML 文件,请尝试:

        <com.google.android.material.card.MaterialCardView
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                app:strokeWidth="1dp"
                app:strokeColor="@color/black"
                app:cardCornerRadius="4dp">
        
                <androidx.appcompat.widget.AppCompatSpinner
                    android:id="@+id/spinner"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:padding="20dp"/>
        
            </com.google.android.material.card.MaterialCardView>
        

        更改边框颜色

        app:strokeColor="YOUR_COLOR_HERE"
        

        要改变边框的宽度

        app:strokeWidth="YOUR_DP_WIDTH_HERE"
        

        【讨论】:

          【解决方案7】:

          您可以设计一个简单的nine-patch png 图像并将其用作微调器的背景。使用 GIMP,您可以在图像中同时放置边框和直角三角形。

          【讨论】:

          【解决方案8】:

          非常简单,您只需将其添加到您的 Adapter -> getDropDownView

          getDropDownView:

          convertView.setBackground(getContext().getResources().getDrawable(R.drawable.bg_spinner_dropdown));
          

          bg_spinner_dropdown:

          <?xml version="1.0" encoding="utf-8"?>
          <shape xmlns:android="http://schemas.android.com/apk/res/android"
              android:shape="rectangle">
              <solid android:color="@color/white" />
              <corners
                  android:bottomLeftRadius=enter code here"25dp"
                  android:bottomRightRadius="25dp"
                  android:topLeftRadius="25dp"
                  android:topRightRadius="25dp" />
          </shape>
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2017-01-09
            • 1970-01-01
            • 1970-01-01
            • 2018-08-21
            • 2014-03-08
            • 1970-01-01
            • 2018-02-22
            相关资源
            最近更新 更多