https://blog.csdn.net/fukaimei/article/details/107938681

前 言

前段时间看到Soul社交应用首页的3D星球视图旋转样式(如下图),所以就想自己能不能实现一个类似的功能。本着不要重复造轮子的原则,所以在网上找有没有开源的轮子,果然真找到有大神开源的依赖库,大神开源的依赖库如下:https://github.com/misakuo/3dTagCloudAndroid,那么下面看看如何实现仿Soul社交应用首页3D星球视图旋转样式的功能。


编码实现

首先在AS的内层build.gradle里添加3d星球视图旋转样式的依赖

dependencies {........// 3d星球视图旋转样式implementation 'com.moxun:tagcloudlib:1.2.0'
}

添加 Layout 布局

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:background="#12121F"tools:context=".MainActivity"><com.moxun.tagcloudlib.view.TagCloudViewandroid:id="@+id/mTagCloudView"android:layout_width="match_parent"android:layout_height="match_parent"app:autoScrollMode="uniform"app:radiusPercent="0.8"app:scrollSpeed="1" /></androidx.constraintlayout.widget.ConstraintLayout>

xml布局文件中的<com.moxun.tagcloudlib.view.TagCloudView />就是用来加载3D星球视图旋转的视图的。

设置3d星球视图Adapter

自定义的适配器Adapter要继承TagsAdapter,代码如下:/**
 * 3d星球View适配器
 */

public class TagCloudViewAdapter extends TagsAdapter {private Context mContext;private List<StarModel> mList;private LayoutInflater inflater;public TagCloudViewAdapter(Context mContext, List<StarModel> mList) {this.mContext = mContext;this.mList = mList;inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);}/*** 返回Tag数量** @return*/@Overridepublic int getCount() {return mList.size();}/*** 返回每个Tag实例** @param context* @param position* @param parent* @return*/@Overridepublic View getView(Context context, int position, ViewGroup parent) {StarModel model = mList.get(position);View mView = null;ViewHolder viewHolder = null;if (mView == null) {viewHolder = new ViewHolder();//初始化ViewmView = inflater.inflate(R.layout.layout_3d_item, null);//初始化控件viewHolder.iv_star_icon = mView.findViewById(R.id.iv_star_icon);viewHolder.tv_star_name = mView.findViewById(R.id.tv_star_name);mView.setTag(viewHolder);} else {viewHolder = (ViewHolder) mView.getTag();}if (!TextUtils.isEmpty(model.getPhotoUrl())) {RequestOptions options = new RequestOptions().placeholder(R.drawable.ic_user).error(R.drawable.ic_user);Glide.with(mContext).load(model.getPhotoUrl()).apply(options).into(viewHolder.iv_star_icon);} else {viewHolder.iv_star_icon.setImageResource(R.drawable.ic_user);}viewHolder.tv_star_name.setText(model.getNickName());return mView;}/*** 返回Tag数据** @param position* @return*/@Overridepublic Object getItem(int position) {return mList.get(position);}/*** 针对每个Tag返回一个权重值,该值与ThemeColor和Tag初始大小有关;* 一个简单的权重值生成方式是对一个数N取余或使用随机数** @param position* @return*/@Overridepublic int getPopularity(int position) {return 7;}/*** Tag主题色发生变化时会回调该方法** @param view* @param themeColor*/@Overridepublic void onThemeColorChanged(View view, int themeColor) {}class ViewHolder {private ImageView iv_star_icon;private TextView tv_star_name;}}

其中继承后回调以下几个方法和作用如下:
public int getCount() —> 返回Tag数量;
public View getView(Context context, int position, ViewGroup parent) —> 返回每个Tag实例;
public Object getItem(int position) —> 返回Tag数据;
public int getPopularity(int position) —> 针对每个Tag返回一个权重值,该值与ThemeColor和Tag初始大小有关;一个简单的权重值生成方式是对一个数N取余或使用随机数;
public void onThemeColorChanged(View view,int themeColor) —> Tag主题色发生变化时会回调该方法。

加载视图

在Activity或者Fragment设置视图的适配器数据以及加载视图,代码以下:

// 设置适配器数据

mTagCloudViewAdapter = new TagCloudViewAdapter(this, mStarModelList);
mTagCloudView.setAdapter(mTagCloudViewAdapter);

设置 3d Tag View 条目点击事件

// 设置 3d Tag View 条目点击事件

mTagCloudView.setOnTagClickListener(new TagCloudView.OnTagClickListener() {@Overridepublic void onItemClick(ViewGroup parent, View view, int position) {String userId = mStarModelList.get(position).getUserId();String nickName = mStarModelList.get(position).getNickName();Toast.makeText(MainActivity.this, String.format("用户id:%s;用户昵称:%s", userId, nickName), Toast.LENGTH_LONG).show();}
});

相关的定制属性如下:
属性    xml    代码    值类型
自动滚动    app:autoScrollMode    setAutoScrollMode(int mode)    enum [disable,uniform,decelerate]
半径百分比    app:radiusPercent    setRadiusPercent(float percent)    float [0,1]
滚动速度    app:scrollSpeed    setScrollSpeed(float scrollSpeed)    float [0,+]
起始颜色    app:lightColor    setLightColor(int color)    int
终止颜色    app:darkColor    setDarkColor(int color)    int

完整的代码以下:

public class MainActivity extends AppCompatActivity {@BindView(R.id.mTagCloudView)TagCloudView mTagCloudView;private TagCloudViewAdapter mTagCloudViewAdapter;private List<StarModel> mStarModelList = new ArrayList<>();@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);ButterKnife.bind(this);// 获取用户数据getData();// 设置适配器数据mTagCloudViewAdapter = new TagCloudViewAdapter(this, mStarModelList);mTagCloudView.setAdapter(mTagCloudViewAdapter);// 设置 3d Tag View 条目点击事件mTagCloudView.setOnTagClickListener(new TagCloudView.OnTagClickListener() {@Overridepublic void onItemClick(ViewGroup parent, View view, int position) {String userId = mStarModelList.get(position).getUserId();String nickName = mStarModelList.get(position).getNickName();Toast.makeText(MainActivity.this, String.format("用户id:%s;用户昵称:%s", userId, nickName), Toast.LENGTH_LONG).show();}});}/*** 模拟从网络获取100条用户数据*/private void getData() {if (mStarModelList != null) mStarModelList.clear();for (int i = 0; i < 100; i++) {StarModel data = new StarModel();data.setUserId("" + i);data.setNickName("彼岸雨敲窗" + i);data.setPhotoUrl("https://fukaimei.oss-cn-beijing.aliyuncs.com/images/ic_user.png?x-oss-process=style/thumb");mStarModelList.add(data);}}}

界面运行效果图如下:

Android开发-仿Soul社交应用首页3D星球视图旋转样式相关推荐

  1. android动画送礼物,Android开发仿映客送礼物效果

    这里写链接内容仿映客送小礼物的特效,顺便复习一下属性动画,话不多说先看效果图. 需求分析 可以看到整个动画有几部分组成,那我们就把每个部分拆分出来各个击破. 1.要显示那些内容以及内容间的位置关系? ...

  2. android 仿简书评论,Android 开发仿简书登录框可删除内容或显示密码框的内容

    简书App 是我很喜欢的一款软件.今天就模仿了一下他的登录框.先上图: 好了下面上代码,自定义ImgEditText 继承与EditText.重写一些方法. package lyf.myimgedit ...

  3. Android点击按钮显示密码,Android 开发仿简书登录框可删除内容或显示密码框的内容...

    简书App 是我很喜欢的一款软件.今天就模仿了一下他的登录框.先上图: 好了下面上代码,自定义ImgEditText 继承与EditText.重写一些方法. package lyf.myimgedit ...

  4. Android OpenGL 仿自如 APP 裸眼 3D 效果

    概述 之前看到 自如团队 发布的 自如客APP裸眼3D效果的实现 ,非常有趣,不久后,社区内 Android 的开发者们陆续提供了 Flutter. Android 原生 .Android Jetpa ...

  5. 卷起来了!Android OpenGL仿自如APP裸眼3D效果

    /   今日科技快讯   / 近日,"乘联会"微信公众号发布消息,2021年12月新能源乘用车市场多元化发力,厂商批发销量突破万辆的企业有14家,较前期大幅增多,其中:比亚迪933 ...

  6. Android开发笔记(一百三十三)导航视图NavigationView

    导航视图NavigationView 很多App都有个人中心的侧滑菜单,通常在页面左侧边缘右拉时,即可弹出个人中心的菜单页面.对于Android来说,侧滑功能用到了抽屉布局DrawerLayout,我 ...

  7. android录音声波动画,Android开发:仿微信 录音声波

    最近在仿微信开发聊天界面:开发到一个有意思的小东西,简单写一写.就是录音声波这块. 首先先添加几个图片 添加如上三个声波图表 之后建立一个数组 private int[] images = {R.mi ...

  8. 云炬Android开发笔记 10主界面-首页UI与数据解析器开发(RecyclerView)

    阅读目录 1.创建首页UI 1.1 检查依赖是否存在 1.2 布局 1.3 控件查找 2.首页下拉刷新实现 2.1[初始化] 2.2 封装刷新功能 2.3 加载数据的处理 3. 首页数据结构分析 3. ...

  9. 3.Android高仿网易云音乐-首页复杂发现界面布局和功能

    0.效果图 效果图依次为发现界面顶部,包含首页轮播图,水平滚动的按钮,推荐歌单:然后是发现界面推荐单曲,点击单曲就是直接进入播放界面:最后是全局播放控制条上点击播放列表按钮显示的播放列表弹窗. 1.整 ...

最新文章

  1. pfSense设置多WAN后,解决网银无法登陆问题
  2. NanoPi NEO Air使用七:获取并编译U-boot和Linux的源码
  3. numpy np.matmul()(两个数组的矩阵乘积)
  4. C 条件变量使用详解
  5. iOS: TableView如何刷新指定的cell 或section
  6. 横流式冷却塔计算风量_研讨丨卓展标准高效制冷机房技术之影响冷却塔效率的几个因素...
  7. phalcon无限重定向
  8. 10,求一个double型数据base的整数次方《剑指offer》
  9. 【学习总结】GirlsInAI ML-diary day-7-数据类型转换
  10. 木马分析(控制分析)实验
  11. android cardview,安卓 CardView 妙用
  12. 程序员的第一款 Hello World
  13. 苹果 App Clip 技术详解
  14. bmp格式的图片怎么转jpg格式?怎么快速转图片格式?
  15. 通过负载均衡器+域名实现容灾切换-(11)深信服负载均衡器
  16. Java课程学习四:编程题
  17. 网易云音乐、微博成新规后首批IPO企业 招股书披露数据安全风险
  18. Android CPU 双核,骁龙MSM8625双核处理器
  19. 基于SSM的网上书城系统设计与实现
  20. Matlab 方位角计算

热门文章

  1. Ubuntu 22.04启动网易云音乐失败
  2. 国内蓝牙耳机品牌哪个好?音质高的国产品牌蓝牙耳机排行
  3. Java网络编程(Socket、URLConnection)
  4. 南京邮电大学c语言期末考试试卷答案,c语言期中考试试题
  5. mongo3.2 数组索引作为联合索引的一部分导致的范围查询问题
  6. 微信小程序引入Vant UI步骤
  7. Python 遍历数组元素
  8. 【java】动态输入数组
  9. 锐龙r54600u核显相当于 r5 4600u属于什么水平
  10. 一名优秀的程序员,总结的20条金句良言,真正的生存指南