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

首先自定义一个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实现圆形环绕效果相关推荐

  1. android 清空canvas部分内容_Android自定义View实现圆形头像效果

    在我们的APP中通常会遇到,展示圆形头像的需求,一般通过Glide就能实现,但是让我们做一个圆形头像,如果让我们自定义实现这种效果,该怎样做呢? 好,接下来本文通过三种方式来实现这种效果! 注意:这是 ...

  2. android view 渐变动画,Android自定义view渐变圆形动画

    本文实例为大家分享了Android自定义view渐变圆形动画的具体代码,供大家参考,具体内容如下 直接上效果图 自定义属性 attrs.xml文件 创建一个类 ProgressRing继承自 view ...

  3. android刷新时的圆形动画_Android自定义view渐变圆形动画

    本文实例为大家分享了Android自定义view渐变圆形动画的具体代码,供大家参考,具体内容如下 直接上效果图 自定义属性 attrs.xml文件 创建一个类 ProgressRing继承自 view ...

  4. android 立体 流量球,Android自定义View——实现水波纹效果类似剩余流量球

    Android自定义View--实现水波纹效果类似剩余流量球 三个点   pre   ber   block   span   初始化   move   理解最近突然手痒就想搞个贝塞尔曲线做个水波纹效 ...

  5. Android尺子布局和自定义TextView

    Android尺子布局和自定义TextView 下面是具体实现: 新建项目:在UI中 <LinearLayout xmlns:android="http://schemas.andro ...

  6. Android动画特效之自定义View

      Android动画特效之Animator属性动画实现_Angel-杭州的博客-CSDN博客   我在百忙之中抽出宝贵时间来实现Android动画特效,也就是Android Animator动画效果 ...

  7. android卡包动画,自定义View实现银行卡卡包动画效果

    本来不想自己造轮子的,但奈何没找动相应效果的轮子,所以只能自己写了,其实还是白嫖来的轻松,哈哈 先看效果 这个是完成的效果,还可以吧!关键也不难一个自定义View搞定 先说一下思路,继承一个Relat ...

  8. Android实现雪花特效自定义view

    一.前言 这个冬天,老家一直没有下雨, 正好圣诞节,就想着制作一个下雪的特效. 圣诞祝福:平安夜,舞翩阡.雪花飘,飞满天.心与心,永相伴. 圣诞节是传统的宗教节日,对于基 督徒,那是庆祝耶稣的诞生,纪 ...

  9. Android 气泡动画(自定义View类)

    Android 气泡动画(自定义View类) 一.前言 二.代码 1. 随机移动的气泡 2.热水气泡 一.前言 最近有需求制作一个水壶的气泡动画,首先在网上查找了一番,找到了一个文章. https:/ ...

最新文章

  1. 在AMD-M上安装x86 OS.X.10.4.3失败
  2. python代码大全p-Python5种代码维护工具
  3. 汇编指令prefix rep:
  4. js Blob对象介绍
  5. IBM Storwize V7000 Introduction(1)
  6. php 图片 3d旋转图片,html5实现图片的3D旋转效果
  7. [数位dp] bzoj 3209 花神的数论题
  8. 2020身高体重标准表儿童_男女孩最新身高标准表,你家孩子达标了吗?(附增高秘籍)...
  9. 15 PP配置-生产计划-主数据-定义特殊采购类型
  10. Spring事务总结(一) 内部调用事务失效、异常回滚
  11. java 三子棋_java三子棋,高手帮忙
  12. bolt界面引擎学习笔记一
  13. begintrans返回值_BeginTransaction() 方法
  14. 全国哀悼日,让网站全站变成灰色的CSS代码
  15. 电脑小知识:最常用的10个电脑技巧
  16. 柯西过程(Cauchy process)
  17. kjb文件 解析_在Linux上使用lnav监控和分析Apache日志文件工具
  18. 架构的道与术-软件架构设计
  19. 华为mate30pro和荣耀v30pro的区别 哪个好
  20. 搜索引擎Google的小秘密

热门文章

  1. python asyncio 异步编程---协程
  2. 单反相机内部光线反射原理
  3. leetcode哈希表(python与c++)
  4. 【每日SQL打卡】​​​​​​​​​​​​​​​DAY 26丨餐馆营业额变化增长【难度中等】​
  5. promise的状态值_什么是Promise,Promise的三种状态
  6. 多个线程访问统一对象的不同方法_分析| 你未必真的了解线程安全,别骗自己,来看下怎么实现线程安全...
  7. C#灰度图转伪彩色图
  8. [数据库]-----mysql数据的冷热分离 第二版
  9. JAVA入门级教学之(异常机制的原理到底是什么)
  10. JAVA入门级教学之(文档里的is-a、is-like-a、has-a到底是什么意思)