android 环绕布局,Android自定义View实现圆形环绕效果

之前项目中需要实现一个四周环绕中心圆形头像的效果,感觉还是自定义比较方便,于是就自己封装了一个控件去实现。先贴张图显示最终效果。

014c7f2441a3196429f79a07706fda23.png

首先自定义一个View继承自LinearLayout,通过动态添加childView的方式将子控件添加到View中。思路是先添加中间圆形头像,然后添加周围的小图标。

1.实现了圆形头像的显示,可以去参考网上或github上的demo,圆形头像的外圈其实是一个View,然后再把头像这个View盖到这个View上。

2.计算好周围相邻view之间的角度,这里是要水平铺满,最多6个,所以相邻之间的角度为180/ (6 - 1) = 36度。如果是360环绕,放n个图标,则相邻之间的角度应该为360 / n 。

3.设置图标到圆心的距离r。距离要大于头像的半径加上图标的半径。

4.确定图标的坐标:控件的宽为width,高为height。假设左边第一个图标是起始位置。图标的起始角度为α= 180 - 36 * i,则它的横坐标为width/2 + cos(α)r,纵坐标为height/2 - sin(α) r。

5.设置坐标点,默认为图标的左上角顶点和右下点,如果想设图标的中心点为坐标,则左上定点x、y分别减去width/2和height/2,右下角分别加上width/2、height/2。

下面附上主要代码:

package com.ihaveu.iuzuan.cardgame.widget;

import android.content.Context;

import android.support.annotation.Nullable;

import android.util.AttributeSet;

import android.view.LayoutInflater;

import android.view.View;

import android.widget.LinearLayout;

import com.ihaveu.iuzuan.cardgame.R;

import com.ihaveu.iuzuan.cardgame.util.MeasureUtil;

import java.util.ArrayList;

import java.util.List;

/**

* Created by zhouhui on 17-6-8.

* 添加圆形子控件实现时钟环绕效果

*/

public class CircleImageLayout extends LinearLayout{

private double mAngle = 0;//初始角度

private int mX, mY;//子控件位置

private int mWidth, mHeight;//控件长宽

private int mRadius;//子控件距离控件圆心位置

private int mCount;

private List mCircleImageViewList;

private CircleImageView mCircleImageView;

public CircleImageLayout(Context context) {

this(context, null);

}

public CircleImageLayout(Context context, @Nullable AttributeSet attrs) {

this(context, attrs, 0);

}

public CircleImageLayout(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {

super(context, attrs, defStyleAttr);

mCircleImageViewList = new ArrayList<>();

}

/**

* 设置子控件到控件圆心的位置

*/

public void setRadius(int radius) {

mRadius = radius;

}

@Override

protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

super.onMeasure(widthMeasureSpec, heightMeasureSpec);

mWidth = getMeasuredWidth();

mHeight = getMeasuredHeight();

}

@Override

protected void onLayout(boolean changed, int left, int top, int right, int bottom) {

super.onLayout(changed, left, top, right, bottom);

initDraw();

}

public void initDraw() {

mCount = getChildCount();

for (int i = 0; i < mCount; i++) {

View child = getChildAt(i);

child.getWidth();

child.getHeight();

if (i == 0) {

mX = mWidth / 2;

mY = mHeight / 2;

} else {

mAngle = 180 - 180 / (mCount - 1) * (i - 1);

mX = (int) (mWidth / 2 + Math.cos(Math.toRadians(mAngle)) * mRadius);

mY = (int) (mHeight / 2 - Math.sin(Math.toRadians(mAngle)) * mRadius);

}

child.layout(mX - child.getWidth() / 2, mY - child.getHeight() / 2, mX + child.getWidth() / 2, mY + child.getHeight() / 2);

}

}

/**

* 初始化环绕数量半径

*/

public void init(int count, int radius) {

mRadius = radius;

for (int i = 0; i < count + 1; i++) {

CircleImageView imageView = new CircleImageView(getContext());

if (i == 0) {

//i为0时为圆型头像

View view = LayoutInflater.from(getContext()).inflate(R.layout.layout_header, null, true);

mCircleImageView = (CircleImageView) view.findViewById(R.id.iv_header);

addView(view);

} else {

addView(imageView, MeasureUtil.dip2px(15), MeasureUtil.dip2px(15));

mCircleImageViewList.add(imageView);

}

}

}

}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/506677.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

android 高德地图 sh1,百度、高德地图获取发布版(Release)SHA1

一、简介&#xff1a;在百度、高德地图开发中&#xff0c;申请key的时候&#xff0c;要两个版本的sha1值。一个是开发版(debug)&#xff0c;一个是发布版(release)。debug版本的sha1比较好获取&#xff0c;网上资料一堆&#xff0c;这里引用一下&#xff0c;就不再重复写了。最…

html前台检验特殊字符正则,【Qt编程】html特殊字符及正则表达式

1、html特殊字符的显示我们知道html语言和C语言一样也有一些特殊字符&#xff0c;它们是不能正常显示的&#xff0c;必须经过转义&#xff0c;在网上可以查到如何显示这些字符&#xff0c;如下图所示&#xff1a;上图给了最常用的特殊字符的显示&#xff0c;下面我们来实验一下…

html 变量类型强制转换,html、js前台数据传到后台,spring复杂类型转换

html、js前台数据传到后台&#xff0c;spring复杂类型转换如果我有两个变量&#xff0c;变量名不一样&#xff0c;处理的规则也不一样&#xff0c;但是他们都是Date.class 类型&#xff0c; 这可怎么破。比如&#xff1a;InitBinderpublic void bindingPreparation(WebDataBind…

html盒模型中border的写法,HTML+css盒子模型案例(圆,半圆等)“border-radius” 简单易上手...

很多小伙伴在前端学习的时候&#xff0c;发现盒子模型默认为正方形。如何把盒子变成想要的模型呢&#xff1f; 首先我们来看一下默认的情况----.box{width: 100px;height: 100px;background-color: rgb(116, 51, 51);box-shadow:0 10px 10px red;text-align: center;position:a…

希捷银河声音大_每日观影之银河守门员( )

#银河守门员Вратарь Галактики#真心不错的科幻大片…尤其这剧情故事实在是俄国电影的一个很有突破性的亮点…基本可以说全方面凸显了俄罗斯的国情…比如高大上的部分完全不输欧美甚至有所超越领先都是要拯救世界而且还很壮烈拼搏的样子…然而百姓生活却显得很窘…

bat循环执行带参数_wxappUnpacker的bingo.bat脚本逐行解读

点击上方“蓝字”关注我们之前发过一篇文章小程序反编译工具在windows系统下的调用脚本提到了Windows平台下的脚本&#xff0c;但是对脚本没有做详细说明。本文就是针对脚本做的讲解。对批处理感兴趣的可以了解下。不会基础也没关系。下面我们进入正题。脚本解读第1行&#xff…

定值保险计算举例_保险公司的“开门红”又要来了!理财险真的值得买吗?

临近年末&#xff0c;各家保险公司都开始备战2020年的“开门红”。对于保险公司来说&#xff0c;“开门红全年红”&#xff0c;只要开门红的任务完成得好&#xff0c;那么今年大半年的保费就不用担心了&#xff0c;因此保险公司们对于这一战都十分重视。如果说“双11”、“双12…

html中post语句,html中post乱码的解决方法

html中post乱码的解决方法发布时间&#xff1a;2021-05-27 11:29:00来源&#xff1a;亿速云阅读&#xff1a;91作者&#xff1a;小新这篇文章主要介绍html中post乱码的解决方法&#xff0c;文中介绍的非常详细&#xff0c;具有一定的参考价值&#xff0c;感兴趣的小伙伴们一定要…

泸州田家炳中学2021高考成绩查询,2021年泸州中考线出来了吗

中考是人们升高中的必经之路&#xff0c;它虽然没有高考那样振奋人心&#xff0c;但是对于当时的人来说也算是一场最正规的考试。首先&#xff0c;不可否认的是中考是很重要的。虽然它不能对高考有着直接影响&#xff0c;但是却有着间接影响。在每年的六份左右出来。中考是很重…

django返回指定html文件,Django返回HTML文件的实现方法

前面我们简单的了解Django的一些工作原理&#xff0c;其中关于页面展示的内容&#xff0c;也全部都是视图(Views)返回的内容&#xff0c;那么我们也知道前端包括很多内容。如&#xff1a;HTML&#xff0c;CSS&#xff0c;JavaScript等以及各种插件&#xff0c;才具备完全的页面…

计算机网络纠错码,计算机网络:纠错

本文概述当数据从发送方发送到接收方时, 纠错码用于检测和纠正错误。纠错可以通过两种方式处理&#xff1a;向后纠错&#xff1a;发现错误后, 接收方会请求发送方重新传输整个数据单元。前向纠错&#xff1a;在这种情况下, 接收器使用纠错码自动纠正错误。单个附加位可以检测到…

扭矩大好还是马力大好_翡翠手镯圈口到底是买大好,还是买小好?行家告诉你...

现在的女性多数人都喜欢购买翡翠手镯、翡翠手链、翡翠戒面等&#xff0c;尤其对翡翠手镯不仅能表现出女性的知性优美&#xff0c;还对身体有一定的好处。翡翠手镯是翡翠价值中除了翡翠戒面外最高的二等翡翠。因为翡翠手镯除了那种开口式的镶嵌翡翠手镯其他的都是闭口的&#xf…

启动失败代码2_菲斯曼燃气壁挂炉故障代码大全及解决方法

菲斯曼燃气壁挂炉型号菲斯曼燃气壁挂炉故障代码大全及解决方法以&#xff1a;06故障代码&#xff1a;系统压力过低。设备的反映: 燃气器锁定。措施&#xff1a;检查系统水压&#xff0c;必要时补充加注供暖水。 0A故障代码&#xff1a;燃气压力过低。设备的反映: 燃气器锁定。措…

用html5交换两个变量的值,Python判断两个对象相等的原理 python交换两个变量的值为什么不用中间变量...

python语言设计一个类代表花,其中含2个对象属性,2class flower: def __init__ (self, name, shape): self.name name self.shape shape def showname (self): print(self.name) def showshape(self): print(self.shape)if __name__ __main__: f1flower("baihe",&q…

3不能安装库_不锈钢水槽如何安装?3个细节要注意,不能忽视,别被套路了

不锈钢水槽如何安装&#xff1f;3个细节要注意&#xff0c;不能忽视&#xff0c;别被套路了随着时代不断的进步。人们生活水平也是不断的提高。生活用品有时间来选&#xff0c;慢慢的步入了我们的日常中。你们觉得家中最重要的地方是什么呢&#xff1f;其实就是厨房&#xff0c…

vs工程 更换opencv版本_Windows下opencv源代码转化和编译

1. CMake工程转化工具下载。CMake是开源的跨平台安装(编译)工具&#xff0c;OpenCV开源代码想要用VS平台打开并编译得由它来做工程转化操作&#xff0c;最后利用VS平台编译出可在windows平台下运行的动态库文件DLL。CMake下载地址&#xff1a;https://cmake.org/download&#…

清理localstorage_关于Cookie、Session、LocalStorage、Cache-Control(摘录)

关于Cookie、Session、LocalStorage、Cache-Control&#xff0c;在总结前先了解一个过程&#xff1a;当用户在一个浏览器注册账号再登录&#xff0c;客户端和服务器发生了什么&#xff1f;一、发生了什么&#xff1f;1、用户打开注册页面&#xff0c;提交信息&#xff08;登录名…

联想340c笔记本cpu能升级吗_联想扬天威6 2021款酷睿版怎么样?评测值得买吗?从价格和配置看就知道了...

联想扬天威6笔记本电脑现在已经发行到最新的了&#xff0c;对新上市的这款联想扬天威6 2021款在配置&#xff0c;做工&#xff0c;性能全新升级了&#xff0c;目前是值得入手的一款轻薄办公本了&#xff0c;下面一起来详细了解下这款价格和配置情况&#xff0c;看看是不是您需要…

热泵精馏_异丙醇丙酮氢气化学热泵技术验证示范平台建成并完成调试

近日&#xff0c;中国科学院工程热物理研究所传热传质研究中心超强换热团队设计研发的我国首座“异丙醇-丙酮-氢气化学热泵技术验证示范平台”在江苏省高邮市江苏杨钢特钢有限公司建成。目前&#xff0c;平台已完成调试&#xff0c;各部件和系统性能均达到预期目标。该平台是国…

广东有哪些计算机自主招生的大专学校,广州大专自主招生有哪些学校

广州大专自主招生有哪些学校自主招生又称自主选拔&#xff0c;是高校选拔录取工作改革的重要环节。包括国家重点大学自主招生与高职自主招生两大类。以下小编为大家整理了广州大专院校自主招生的学校&#xff0c;希望对大家有所帮助&#xff01;广东专科自主招生学校名单1、广东…