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 tasker,Tasker:Android系统增强神器

权限信息 net.dinglisch.android.tasker.PERMISSION_RUN_TASKS net.dinglisch.android.tasker.PERMISSION_AUTO_IMPORT com.joaomgcd.taskersettings.SET_SETTING net.dinglisch.android.zoom.permission.MAKE_CHANGES android.permission.PACKAGE_USAGE_STATS cyanogenmod.per…

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

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

signature=adf15bd90b83b628c647a1aa64741773,Thoracic Oncology

摘要&#xff1a;Thymic malignancies are rare epithelial tumors that may be aggressive and difficult totreat. Thymomas are usually localized to the anterior mediastinum and are frequentlyeligible for upfront surgical resection. However, nearly 30% of patien…

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…

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

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

html select 修改默认箭头样式,自定义select标签箭头样式

select::-ms-expand{ display: none; }//ie样式清除select{appearance:none;-moz-appearance:none;-webkit-appearance:none;background: url("/uploadfiles/images/alliance/xiala2x.png") no-repeat scroll 480px center transparent;background-size: 20px 10px;p…

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

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

把HTML代码上传到gitee,使用git上传项目到gitee以及VS使用git管理项目

在打开的GIt Bash中输入以下命令(用户和邮箱为你github注册的账号和邮箱)$ git config --global user.name "hanyuntao"$ git config --global user.email "hanyuntaocn163.com"Paste_Image.png2.4 设置SSH key(git中sshkey有何作用&#xff1f;)2.4.1 生成…

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

临近年末&#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;才具备完全的页面…

c++获取图像的长宽 opencv_【第一篇:C++与opencv】图片的读取和显示 | 学步园

这里介绍C版本的opencv&#xff0c;和C语言版本有些不同&#xff0c;先看代码^_^【编译环境&#xff1a;opencv2.4.4和VS2008】#include "stdafx.h"#include "opencv2/opencv.hpp"using namespace cv;using namespace std;int _tmain(int argc, _TCHAR* ar…

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

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

安卓线程同步面试_Android面试题

1、java的重载和重写分别是什么含义&#xff1f;重载&#xff1a;(1) 方法重载是让类以统一的方式处理不同类型数据的一种手段。多个同名函数同时存在&#xff0c;具有不同的参数个数/类型。重载Overloading是一个类中多态性的一种表现。(2) java的方法重载&#xff0c;就是在类…

html ie7高度,在HTML,IE6和IE7中工作的HTML垂直和水平居中的实用解决方案

什么是一个实用的解决方案,可以在HTML,IE6和IE7中使用HTML中的纵向和横向内容&#xff1f;一些细节&#xff1a;>我正在寻找整个页面的解决方案.>您只需要指定要居中的元素的宽度.在设计时间内不知道元素的高度.>最小化窗口时,只有当所有空白区域消失时才会出现滚动.换…

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

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

一年时间学会日语英语计算机可能么,上海开放大学和上海应用技术大学哪个好,高三选地理能报考上海大学日语系或英语系吗?...

又到了一年一度的开学季了&#xff0c;现在有很多学子都在旁听侧问上海开放大学和上海应用技术大学哪个好这些问题&#xff0c;我也整理了一些信息上海大学好不好&#xff0c;上海开放大学的人才培养目标是( )&#xff0c;吉林大学自考本科计算机应用软件专业需要考过几门&…