首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何创建完整的圆形LinearLayout或RelativeLayout

如何创建完整的圆形LinearLayout或RelativeLayout
EN

Stack Overflow用户
提问于 2017-10-27 02:13:06
回答 1查看 5.4K关注 0票数 2

我正在尝试创建一个完整的循环布局,以便如果我将任何内容放入该布局中。内容应该在圆圈内。这怎么可能?我试过以下方法。但它的形状并非一直都是圆形的。有时它会变成椭圆形,这取决于空间。如何始终保持布局的循环和内容应该在它里面?

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<LinearLayout
            android:id="@+id/zodiac_Layout"
            android:layout_width="100dp"
            android:layout_height="100dp"
            android:orientation="vertical"
            android:background="@drawable/circular_background">

            <ImageView
                android:id="@+id/zodiac_img"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:layout_marginRight="2dp"
                android:adjustViewBounds="true"
                android:src="@drawable/sunrise" />

            <TextView
                android:id="@+id/zodiac_name"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="center"
                android:layout_marginLeft="5dp"
                android:text="@string/na"
                android:textColor="#fff"
                android:textSize="@dimen/nakshatra_text_size" />
        </LinearLayout>

这是circular_background.xml

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="oval">
    <solid android:color="#50514F"/>
    <size android:width="5dp"
        android:height="5dp"/>
</shape>

如果我做了ImageView match_parent呢。它是从布局的圆圈形状出来的。我希望内容沿着布局的圆形裁剪。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-10-27 02:25:37

因为我们在评论中已经聊过了。现在我知道你真正想要的是你的ImageView和一个TextView的循环裁剪。因此,经过一项专门的工作之后,我决定形成一个输出的解决方案,如下图所示:

不用担心textView,你可以在任何地方定位它。即使是在图像的顶端!并改变它的大小!

首先,您必须知道在这方面没有默认实现,这意味着在android中没有提供循环裁剪视图的默认视图类。下面是使用XML 解决这个问题的两个替代方案!

优先选择(最佳选择)

我们将使用一个FrameLayout,它是一个在彼此之上添加视图的布局。这意味着,如果你把第一个,那么第二个将是顶部的第一个等等。

Requirements

  • 要在圆形视图中很好地匹配图像,则应该是平方(这是逻辑的),所以我们需要设置宽度和高度相等的值。
  • 我们将需要一个圆型与笔画(想法是把它放在一个精心计算的视图大小!)

drawable文件夹中创建一个名为circular_image_crop.xml的文件。然后粘贴代码(不用担心稍后会描述的!)不要忘了阅读其中的评论:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?xml version="1.0" encoding="utf-8"?>
 <shape xmlns:android="http://schemas.android.com/apk/res/android"
       android:shape="oval">
  <solid android:color="#00ffffff"/>
   <!--The above colour is completely transparent!-->
  <stroke android:width="20dp" android:color="#ec407a" />
  <size android:width="140dp" android:height="140dp"/>
</shape>

创建该drawable文件后,我们将不得不使我们的FrameLayout (此框架布局不是任何视图的根视图,只需将其复制到您想要显示该布局的任何视图中),继续粘贴下面的代码(稍后我们将解释它!)再读一遍其中的评论:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<FrameLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="#ec407a">

        <!-- This is our framelayout! Notice our background color is the same as the one in the stroke of our drawable. Also this is your image view notice the it has width and height similar (square) do use match parent or wrap content just define a square and views will be position by adjust view bounds true-->

        <ImageView
            android:id="@+id/image_view_user_profile_image"
            android:layout_width="100dp"
            android:layout_height="100dp"
            android:layout_gravity="center_horizontal"
            android:layout_marginTop="20dp"
            android:adjustViewBounds="true"
            android:contentDescription="@string/your_image_description"
            android:src="@drawable/your_image" />

        <!-- Ooh here we have another image! This is an image just for displaying our drawable and crop our image (how?? dont worry!) -->

        <ImageView
            android:layout_width="140dp"
            android:layout_height="140dp"
            android:layout_gravity="center_horizontal"
            android:contentDescription="@string/also_your_image_description_if_any"
            android:src="@drawable/circular_image_crop" />
        <!--This text view we almost forget here it is!-->
        <TextView
            android:id="@+id/your_text_view_id"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="bottom"
            android:layout_marginBottom="8dp"
            android:layout_marginTop="125dp"
            android:gravity="center"
            android:text="John Nanai Noni"
            android:textColor="#ffffff"
            android:textSize="16sp"
            android:textStyle="bold" />
    </FrameLayout>

如何工作和自定义!?

好的是,我们使用我们的框架布局和位置,我们的真正的看法在中心水平(方形图像)。我们制作了我们的drawable,这是一个圆形的,并且在中心有一个圆形的洞(空间),的高度和我们的图片相匹配。最后,我们添加文本视图,并将其放在所有文本的顶部,但放在底部(不应该模糊图像,对吗?)

因此,我们理解这一点的方法是将下面的图像作为大纲来查看needed.(dont认为它的complicated):是什么

,所以从那里我们可以看到它是如何在中间的图像上进行的,圆形的作物等等,

下一阶段:

开始,我们可以在整个布局(FrameLayout)中应用相同的背景颜色来隐藏圆形的东西,并留下我们自己的可见空间。

是的,我们已经完成了我们的布局!那定制呢。

Customization

对于颜色,你可以把你自己的颜色在任何地方的FrameLayout背景,以及笔画的可绘制。但是不要改变<solid>的颜色,它应该永远是完全透明的。

为了定制圆形作物的半径,让我们挖掘它的数学公式,计算出图像的覆盖范围!

数学

让您的图像的widthheight(图像是正方形的,记住)是x dps。那么drawable中的值是 stroke= 0.2071 * x 尺寸(高度和宽度)=笔画+ x 您可以2或3 dps消除截断错误!

实际上,后面的数学是基于下面的公式。如果您对下面的评论感兴趣,则此公式有效:

第二代

我认为对不关心圆形视图之间的空间的人来说,另一种选择是在CardView中创建ImageView,并使拐角半径half达到CardView的大小,例如,下面的代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.CardView 
      xmlns:android="http://schemas.android.com/apk/res/android"
      xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="280dp"
    android:layout_height="280dp"
    android:layout_gravity="center_horizontal"
    android:layout_margin="30dp"
    app:cardCornerRadius="140dp"
    app:cardElevation="12dp">

    <ImageView
        android:layout_width="200dp"
        android:layout_height="200dp"
        android:layout_gravity="center"
        android:adjustViewBounds="true"
        android:src="@drawable/login_back_ground" />

 </android.support.v7.widget.CardView>

这是我在android中获得的输出。而且,我也不能保证这将是什么样子,在各种设备,特别是旧的!

结论

这两种方法都是好的和有用的。理解这两者甚至会导致更多的定制,比如使用第一种选择和第二种方法来实现定制,比如添加圆形图像的高度。但是第一种方法适用于日常使用,它也给所有android设备带来了同样的体验。

我希望这将帮助未来的用户谁可能有同样的问题。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46972667

复制
相关文章
[Leetcode][python]Word Break/Word Break II/单词拆分/单词拆分 II
给定一个目标字符串和一组字符串,判断目标字符串能否拆分成数个字符串,这些字符串都在给定的那组字符串中。
蛮三刀酱
2019/03/26
1.3K0
动态规划:单词拆分
题目链接:https://leetcode-cn.com/problems/word-break/
代码随想录
2021/02/26
8650
动态规划:单词拆分
139. 单词拆分
题目 /** * 给定一个非空字符串 s 和一个包含非空单词的列表 wordDict,判定 s 是否可以被空格拆分为一个或多个在字典中出现的单词。 * 说明: * 拆分时可以重复使用字典中的单词。 * 你可以假设字典中没有重复的单词。 * * 示例 1: * 输入: s = "leetcode", wordDict = ["leet", "code"] * 输出: true * 解释: 返回 true 因为 "le
名字是乱打的
2021/12/23
4280
139. 单词拆分
给定一个非空字符串 s 和一个包含非空单词列表的字典 wordDict,判定 s 是否可以被空格拆分为一个或多个在字典中出现的单词。
张伦聪zhangluncong
2022/10/26
2660
140. 单词拆分 II
给定一个非空字符串 s 和一个包含非空单词列表的字典 wordDict,在字符串中增加空格来构建一个句子,使得句子中所有的单词都在词典中。返回所有这些可能的句子。
张伦聪zhangluncong
2022/10/26
1730
LeetCode 0139. 单词拆分[动态规划详解]
给定一个非空字符串 s 和一个包含非空单词的列表 wordDict,判定 s 是否可以被空格拆分为一个或多个在字典中出现的单词。
Yano_nankai
2021/04/12
5310
LeetCode 0139. 单词拆分[动态规划详解]
Leetcode 139. 单词拆分
给定一个非空字符串 s 和一个包含非空单词列表的字典 wordDict,判定 s 是否可以被空格拆分为一个或多个在字典中出现的单词。
zhipingChen
2019/06/19
9390
HDU 1247 字典树 拆分单词
Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 6381    Accepted Submission(s): 2378
csxiaoyao
2019/02/18
5200
LeetCode 0140. 单词拆分 II[动态规划详解]
给定一个非空字符串 s 和一个包含非空单词列表的字典 wordDict,在字符串中增加空格来构建一个句子,使得句子中所有的单词都在词典中。返回所有这些可能的句子。
Yano_nankai
2021/04/12
4390
LeetCode 0140. 单词拆分 II[动态规划详解]
LeetCode 139. 单词拆分(DP)
给定一个非空字符串 s 和一个包含非空单词列表的字典 wordDict,判定 s 是否可以被空格拆分为一个或多个在字典中出现的单词。
Michael阿明
2020/07/13
3880
LeetCode 139. 单词拆分(DP)
高频面试系列:单词拆分问题
读完本文,可以去力扣解决如下题目: 139. 单词拆分(中等) 140. 单词拆分II(困难)
labuladong
2022/09/01
6550
高频面试系列:单词拆分问题
Leetcode|完全背包|139. 单词拆分
1 动态规划(完全背包) 基于问题本身,先背包后物品的顺序比较方便,也好理解 class Solution { public: bool wordBreak(string s, vector<string>& wordDict) { int bagSize = s.size(); vector<bool> dp(bagSize + 1, false); dp[0] = true; for (int j = 1; j <= bagSi
SL_World
2021/09/18
3850
刷题第6篇:单词拆分
我们使用递归的方法。每当遍历到一个字典中的单词之后,记录下当前的索引值,然后继续向后遍历。如果遍历到最后一个字符,恰好连接前面的字符,属于字典中的单词,则将此分割方式记录下来。
鹏-程-万-里
2020/02/26
3580
Leetcode No.140 单词拆分 II(DFS)
给定一个非空字符串 s 和一个包含非空单词列表的字典 wordDict,在字符串中增加空格来构建一个句子,使得句子中所有的单词都在词典中。返回所有这些可能的句子。 说明: 分隔时可以重复使用字典中的单词。 你可以假设字典中没有重复的单词。
week
2022/01/06
5780
​LeetCode刷题实战139:单词拆分
https://leetcode-cn.com/problems/word-break/
程序员小猿
2021/01/19
3960
Leetcode No.139 单词拆分(动态规划)
给定一个非空字符串 s 和一个包含非空单词的列表 wordDict,判定 s 是否可以被空格拆分为一个或多个在字典中出现的单词。
week
2021/11/29
5420
Leetcode No.139 单词拆分(动态规划)
在ASP.NET 5中使用SignalR
题记:SignalR作为ASP.NET中进行Web实时双向通信的组件,在ASP.NET 5中也得到了同步发展。不过,用法和之前还是在细节上有所不同,而资料又相对稀少。本文就是一个简单的入门向导。 通过SignalR,开发人员可以在ASP.NET开发的Web应用中实现服务器和客户端的双向实时通信。服务器可以即时推送内容给在线的客户端。SignalR首选Web Sockets作为底层实现,针对非现代浏览器也可以回退到其他兼容技术。它的特性很丰富,支持链接管理、分组连接和授权控制等。 在ASP.NET 5时代,S
逸鹏
2018/04/10
3.3K0
在ASP.NET 5中使用SignalR
英语单词记忆法拆分2000个_usually拆分记忆
给定一个非空字符串 s 和一个包含非空单词列表的字典 wordDict,在字符串中增加空格来构建一个句子,使得句子中所有的单词都在词典中。返回所有这些可能的句子。
全栈程序员站长
2022/09/22
3160
Asp.net中文本框全选
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/105743.html原文链接:https://javaforall.cn
全栈程序员站长
2022/08/09
1.4K0
在 Linkerd 中实现流量拆分功能
在 Linkerd 中,金丝雀发布是通过流量拆分来管理的,这项功能允许你根据可动态配置的权重,将请求分配给不同的 Kubernetes 服务对象。虽然流量分割可以适用于任意的 Service 对象,但一般情况下是将一个 Service 的传入流量分给不同版本的 Service。
我是阳明
2022/09/29
1.1K0
在 Linkerd 中实现流量拆分功能

相似问题

使用vba在文本框中查找单词

11

使用Regex拆分单词

24

使用CSS拆分单词

60

在SQL Server中拆分单词

214

在camelCase javascript中拆分单词

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文