Android自定義View實現(xiàn)圓形環(huán)繞效果
之前項目中需要實現(xiàn)一個四周環(huán)繞中心圓形頭像的效果,感覺還是自定義比較方便,于是就自己封裝了一個控件去實現(xiàn)。先貼張圖顯示最終效果。

首先自定義一個View繼承自LinearLayout,通過動態(tài)添加childView的方式將子控件添加到View中。思路是先添加中間圓形頭像,然后添加周圍的小圖標。
1.實現(xiàn)了圓形頭像的顯示,可以去參考網(wǎng)上或github上的demo,圓形頭像的外圈其實是一個View,然后再把頭像這個View蓋到這個View上。
2.計算好周圍相鄰view之間的角度,這里是要水平鋪滿,最多6個,所以相鄰之間的角度為180/ (6 - 1) = 36度。如果是360環(huán)繞,放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.
* 添加圓形子控件實現(xiàn)時鐘環(huán)繞效果
*/
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<CircleImageView> 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);
}
}
/**
* 初始化環(huán)繞數(shù)量半徑
*/
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使用CircleImageView實現(xiàn)圓形頭像的方法
- Android布局自定義Shap圓形ImageView可以單獨設置背景與圖片
- Android實現(xiàn)圓角矩形和圓形ImageView的方式
- Android開發(fā)中TextView 實現(xiàn)右上角跟隨文本動態(tài)追加圓形紅點
- Android項目實戰(zhàn)手把手教你畫圓形水波紋loadingview
- Android自定義控件之圓形、圓角ImageView
- 詳解Android中Glide與CircleImageView加載圓形圖片的問題
- Android 自定義圓形頭像CircleImageView支持加載網(wǎng)絡圖片的實現(xiàn)代碼
- Android自定義view實現(xiàn)圓形與半圓形菜單
- Android中使用CircleImageView和Cardview制作圓形頭像的方法
相關文章
Android控件RecyclerView實現(xiàn)混排效果仿網(wǎng)易云音樂
這篇文章主要為大家詳細介紹了Android控件RecyclerView實現(xiàn)混排效果,仿網(wǎng)易云音樂,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-10-10
圖解Windows環(huán)境下Android Studio安裝和使用教程
這篇文章主要介紹了圖解Windows環(huán)境下Android Studio安裝和使用教程的相關資料,需要的朋友可以參考下2015-12-12
Android ListView實現(xiàn)上拉加載下拉刷新和滑動刪除功能
這篇文章主要為大家詳細介紹了Android ListView實現(xiàn)上拉加載下拉刷新和滑動刪除功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-12-12
Android OnCreate()中獲取控件高度與寬度兩種方法詳解
這篇文章主要介紹了Android OnCreate()中獲取控件高度與寬度兩種方法詳解的相關資料,這里提供了兩種方法,大家可以都看下,需要的朋友可以參考下2016-12-12
Android中的SpannableString與SpannableStringBuilder詳解
這篇文章主要給大家介紹了關于Android中SpannableString與SpannableStringBuilder的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧。2017-10-10
android Launcher AppWidget添加步驟介紹
大家好,本篇文章主要講的是android Launcher AppWidget添加步驟介紹,感興趣的同學趕快來看一看吧,對你有幫助的話記得收藏一下,方便下次瀏覽2022-01-01
Android?kotlin?跳轉手機熱點開關頁面和判斷熱點是否打開(親測可用)
跳轉手機熱點的頁面肯定是用intent,重點是action不知道是什么,網(wǎng)上最常見的就是Settings.ACTION_WIFI_SETTINGS 跳轉wifi設置頁面,本文介紹Android?kotlin?跳轉手機熱點開關頁面和判斷熱點是否打開,感興趣的朋友一起看看吧2023-08-08

