【问题标题】:Android drawable tooltip arrow boxAndroid 可绘制工具提示箭头框
【发布时间】:2021-04-22 13:42:07
【问题描述】:

我尝试使用以下代码创建一个弹出窗口,顶部带有类似工具提示的箭头。附图片。 但结果我得到了一些不同的东西。
弹出式充气机:

LayoutInflater inflater = (LayoutInflater)
                        getApplicationContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
              View  view = inflater.inflate(R.layout.popup, null);
              mypopupWindow = new PopupWindow(view,500, RelativeLayout.LayoutParams.WRAP_CONTENT, true);            
              mypopupWindow.setBackgroundDrawable(new ColorDrawable(Color.WHITE));
              mypopupWindow.showAsDropDown(v,-153,0);

弹出布局:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">
<LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:padding="50dp"
        android:layout_marginTop="50dp"
        android:background="@drawable/shadow_recta"
        android:orientation="vertical"
        android:gravity="center">
     <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="20dp"
            android:text="text long text" />
        <Button
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Button"/>
</LinearLayout>

可绘制文件:

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:gravity="top|center_horizontal" >
        <rotate android:fromDegrees="0" android:toDegrees="-45"
            android:pivotX="0%" android:pivotY="50%" >
            <shape android:shape="rectangle">
                <size android:width="24dp" android:height="24dp" />
                <stroke android:color="@android:color/holo_blue_bright" android:width="1dp"/>
            </shape>
        </rotate>
    </item>
    <item>
        <shape android:shape="rectangle">
            <size android:width="206dp" android:height="76dp" />
            <solid android:color="@android:color/white" />
            <stroke android:color="@android:color/holo_blue_bright"  android:width="1dp"/>
            <corners android:radius="2dp" />
        </shape>
    </item>

    <item android:gravity="top|center_horizontal">
        <rotate
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:fromDegrees="-45"
            android:pivotX="-50%"
            android:pivotY="60%"
            android:toDegrees="35">
            <shape android:shape="rectangle">
                <solid android:color="@android:color/white" />
                <size
                    android:width="24dp"
                    android:height="24dp" />
                <stroke
                    android:width="1dp"
                    android:color="@android:color/holo_blue_bright" />
            </shape>
        </rotate>
    </item>
</layer-list>

预期图像:

我得到的输出:

请帮我按照预期的图像创建一个盒子。

【问题讨论】:

    标签: android android-drawable android-shape


    【解决方案1】:

    没那么难,关键是三个做这个layer-listDrawable

    • 工具提示(三角形)必须是固定大小的。

    • 背景不能是固定大小,因为内容大小是未知的。

    • 调整边距和内边距(在Drawable 内)。


    1.创建layer-listDrawable

    <layer-list
        xmlns:android="http://schemas.android.com/apk/res/android">
    
        <item                      //background part
            android:top="17dp">    //margin top, half of the 【rotated】 rectangle height
    
            <shape
                android:shape="rectangle">
    
                <solid 
                    android:color="@color/purple_200" />
    
                <corners 
                    android:radius="8dp" />
    
                <padding                    //important part
                    android:top="17dp" />   //offset the margin top, shows up the tooltip perfectly
    
            </shape>
    
        </item>
    
        <item                       //tooltip part
            android:width="24dp"    //size must be fixed
            android:height="24dp"
            android:end="32dp"     //margin end (right)
            android:gravity="end"  //place wherever you want 
            android:top="-12dp">   //margin top, negative half of its height, display half of this rotated rectangle
    
            <rotate 
                android:fromDegrees="45">
    
                <shape 
                    android:shape="rectangle">
    
                    <solid 
                        android:color="@color/purple_500" />    //change back to background part color after your experiment and testing
    
                </shape>
    
            </rotate>
    
        </item>
    
    </layer-list>
    

    2。申请View:

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hi, I'm Sam"
        android:textColor="@color/black"
        android:textSize="40sp"
        android:background="@drawable/chat_background"    //here
        android:paddingHorizontal="16dp"/>                //apply padding bottom in Drawable, not in here
    
    <TextView                                             //just for comparison
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="16dp"
        android:text="Hi, I'm Sam"
        android:textColor="@color/black"
        android:textSize="40sp"
        android:background="@color/purple_200"
        android:paddingHorizontal="16dp"/>
    

    结果:


    小数学:

    • 未旋转的矩形高度为24dp
    • 旋转后的矩形高度为square root of (24^2)*2 = 33.9411
    • 旋转矩形高度的一半是16.9706,所以我们取17

    应用垂直填充的提示:

    • 修改背景部分的顶部内边距(例如:17dp + 8dp = 25dp)。

    • 修改工具提示(旋转矩形)部分的顶部边缘以取消(例如:-12dp - 8dp = -20dp)。

    【讨论】:

    • 这帮助我按预期创建了一个箭头。但无法仅在顶部绘制蓝色边框。任何想法?
    • @Malhotra Easy.
    【解决方案2】:

    这是你的要求:

    • 笔画风格
    • 仅显示箭头顶部

    1.将我的示例答案从纯色样式更改为描边样式:

    • 应用于背景部分工具提示部分

      <stroke
          android:color="@color/purple_200"
          android:width="2dp"/>    //border thickness, keep this in mind
      
      <solid
          android:color="@color/white" />    //white background color, must have
      
    • 现在你注意到旋转矩形的下半部分也显示出来了,如何隐藏它?好吧,我们的想法是制作一些东西来覆盖/覆盖它 - 但不是完全。我们还需要一层。

    2。复制工具提示部分使其成为第三层,我们只需将其向下移动border width + 1dp = 3dp 的距离,并赋予其纯白色背景:

    <item
        android:width="24dp"
        android:height="24dp"
        android:end="32dp"
        android:gravity="end"
        android:top="-9dp">    //here, -12 + 3 = -9
    
        <rotate
            android:fromDegrees="45">
    
            <shape
                android:shape="rectangle">
    
                <solid
                    android:color="@color/purple_500" />    //change back to white after your testing
    
            </shape>
    
        </rotate>
    
    </item>
    

    结果:

    【讨论】:

    • @Malhotra 这有帮助吗?
    猜你喜欢
    • 1970-01-01
    • 2019-09-07
    • 2015-06-24
    • 1970-01-01
    • 2019-05-03
    • 2014-12-04
    • 2017-02-05
    • 2017-06-16
    • 1970-01-01
    相关资源
    最近更新 更多