android 环绕布局,Android自定义View实现圆形环绕效果
之前项目中需要实现一个四周环绕中心圆形头像的效果,感觉还是自定义比较方便,于是就自己封装了一个控件去实现。先贴张图显示最终效果。
首先自定义一个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);
}
}
}
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
android 环绕布局,Android自定义View实现圆形环绕效果相关推荐
- android 清空canvas部分内容_Android自定义View实现圆形头像效果
在我们的APP中通常会遇到,展示圆形头像的需求,一般通过Glide就能实现,但是让我们做一个圆形头像,如果让我们自定义实现这种效果,该怎样做呢? 好,接下来本文通过三种方式来实现这种效果! 注意:这是 ...
- android view 渐变动画,Android自定义view渐变圆形动画
本文实例为大家分享了Android自定义view渐变圆形动画的具体代码,供大家参考,具体内容如下 直接上效果图 自定义属性 attrs.xml文件 创建一个类 ProgressRing继承自 view ...
- android刷新时的圆形动画_Android自定义view渐变圆形动画
本文实例为大家分享了Android自定义view渐变圆形动画的具体代码,供大家参考,具体内容如下 直接上效果图 自定义属性 attrs.xml文件 创建一个类 ProgressRing继承自 view ...
- android 立体 流量球,Android自定义View——实现水波纹效果类似剩余流量球
Android自定义View--实现水波纹效果类似剩余流量球 三个点 pre ber block span 初始化 move 理解最近突然手痒就想搞个贝塞尔曲线做个水波纹效 ...
- Android尺子布局和自定义TextView
Android尺子布局和自定义TextView 下面是具体实现: 新建项目:在UI中 <LinearLayout xmlns:android="http://schemas.andro ...
- Android动画特效之自定义View
Android动画特效之Animator属性动画实现_Angel-杭州的博客-CSDN博客 我在百忙之中抽出宝贵时间来实现Android动画特效,也就是Android Animator动画效果 ...
- android卡包动画,自定义View实现银行卡卡包动画效果
本来不想自己造轮子的,但奈何没找动相应效果的轮子,所以只能自己写了,其实还是白嫖来的轻松,哈哈 先看效果 这个是完成的效果,还可以吧!关键也不难一个自定义View搞定 先说一下思路,继承一个Relat ...
- Android实现雪花特效自定义view
一.前言 这个冬天,老家一直没有下雨, 正好圣诞节,就想着制作一个下雪的特效. 圣诞祝福:平安夜,舞翩阡.雪花飘,飞满天.心与心,永相伴. 圣诞节是传统的宗教节日,对于基 督徒,那是庆祝耶稣的诞生,纪 ...
- Android 气泡动画(自定义View类)
Android 气泡动画(自定义View类) 一.前言 二.代码 1. 随机移动的气泡 2.热水气泡 一.前言 最近有需求制作一个水壶的气泡动画,首先在网上查找了一番,找到了一个文章. https:/ ...
最新文章
- 在AMD-M上安装x86 OS.X.10.4.3失败
- python代码大全p-Python5种代码维护工具
- 汇编指令prefix rep:
- js Blob对象介绍
- IBM Storwize V7000 Introduction(1)
- php 图片 3d旋转图片,html5实现图片的3D旋转效果
- [数位dp] bzoj 3209 花神的数论题
- 2020身高体重标准表儿童_男女孩最新身高标准表,你家孩子达标了吗?(附增高秘籍)...
- 15 PP配置-生产计划-主数据-定义特殊采购类型
- Spring事务总结(一) 内部调用事务失效、异常回滚
- java 三子棋_java三子棋,高手帮忙
- bolt界面引擎学习笔记一
- begintrans返回值_BeginTransaction() 方法
- 全国哀悼日,让网站全站变成灰色的CSS代码
- 电脑小知识:最常用的10个电脑技巧
- 柯西过程(Cauchy process)
- kjb文件 解析_在Linux上使用lnav监控和分析Apache日志文件工具
- 架构的道与术-软件架构设计
- 华为mate30pro和荣耀v30pro的区别 哪个好
- 搜索引擎Google的小秘密
热门文章
- python asyncio 异步编程---协程
- 单反相机内部光线反射原理
- leetcode哈希表(python与c++)
- 【每日SQL打卡】​​​​​​​​​​​​​​​DAY 26丨餐馆营业额变化增长【难度中等】​
- promise的状态值_什么是Promise,Promise的三种状态
- 多个线程访问统一对象的不同方法_分析| 你未必真的了解线程安全,别骗自己,来看下怎么实现线程安全...
- C#灰度图转伪彩色图
- [数据库]-----mysql数据的冷热分离 第二版
- JAVA入门级教学之(异常机制的原理到底是什么)
- JAVA入门级教学之(文档里的is-a、is-like-a、has-a到底是什么意思)