iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >Android如何自定义ViewGroup实现朋友圈九宫格控件
  • 766
分享到

Android如何自定义ViewGroup实现朋友圈九宫格控件

2023-06-20 15:06:26 766人浏览 安东尼
摘要

本篇内容介绍了“Android如何自定义ViewGroup实现朋友圈九宫格控件”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!目录一、简介1、

本篇内容介绍了“Android如何自定义ViewGroup实现朋友圈九宫格控件”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

目录
  • 一、简介

    • 1、效果图如下

    • 2、主要功能如下

  • 二、使用

    • 1、自定义属性如下

    • 2、布局中使用自定义NineImageLayout

    • 3、Adapter方式绑定数据和UI

    • 4、列表里面使用

  • 三、源码地址

    一、简介

    最近项目里有个类似微信朋友圈的九图控件的需求,GitHub找了一下,发现都不太满足需求,我需要单张图片的时候可以按照图片宽高比列在一定范围内自适应,而大多开源项目单张图片也是一个小正方形,所以,干脆自己动手写一个

    1.1、效果图如下

    Android如何自定义ViewGroup实现朋友圈九宫格控件

    1.2、主要功能如下

    单张图片的时候支持按照图片宽高比列在设定区域内自适应

    Adapter方式绑定数据和UI

    图片点击事件回调

    设置图片间隔大小

    自由通过Glide设置ImageView圆角效果

    二、使用

    2.1、自定义属性如下

    <resources>    <declare-styleable name="NineImageLayout">        <!-- 控件宽高 -->        <attr name="nine_layoutWidth" fORMat="dimension"/>        <!-- 单张图片时的最大宽高范围-->        <attr name="nine_singleImageWidth" format="dimension" />        <!-- 图片之间间隙大小 -->        <attr name="nine_imageGap" format="dimension" />    </declare-styleable></resources>

    2.2、布局中使用自定义NineImageLayout

     <com.cyq.customview.nineLayout.view.NineImageLayout        android:id="@+id/nine_image_layout"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_below="@+id/tv_title"        android:layout_marginTop="20dp"        app:nine_imageGap="4dp"        app:nine_layoutWidth="300dp"        app:nine_singleImageWidth="180dp" />

    2.3、Adapter方式绑定数据和UI

    其中Glide.asBitmap是为了计算图片宽高,如果后台有返回图片的宽高可以省略这一步,直接setSingleImage(width, height,imageView),

    Ps:如果可以建议后台返回图片宽高,这样可以避免单张图片的时候控件高度跳屏,比如我限制单张图片宽高在200dp范围,要展示宽1000px高500px的时候,在图片未加载完成时控件宽高为200dp,图片加载完成后高度变为100dp,会有一个不好的用户体验,所以建议上传图片的时候记录图片宽高信息

    nineImageLayout.setAdapter(new NineImageAdapter() {            @Override            protected int getItemCount() {                return mData.size();            }            @Override            protected View createView(LayoutInflater inflater, ViewGroup parent, int i) {                return inflater.inflate(R.layout.item_img_layout, parent, false);            }            @Override            protected void bindView(View view, final int i) {                final ImageView imageView = view.findViewById(R.id.iv_img);                Glide.with(mContext).load(mData.get(i)).into(imageView);                if (mData.size() == 1) {                    Glide.with(mContext)                            .asBitmap()                            .load(mData.get(0))                            .into(new SimpleTarget<Bitmap>() {                                @Override                                public void onResourceReady(Bitmap bitmap, Transition<? super Bitmap> transition) {                                    final int width = bitmap.getWidth();                                    final int height = bitmap.getHeight();                                    nineImageLayout.setSingleImage(width, height,imageView);                                }                            });                    Glide.with(mContext).load(mData.get(0)).into(imageView);                } else {                    Glide.with(mContext).load(mData.get(i)).into(imageView);                }            }            @Override            public void OnItemClick(int i, View view) {                super.OnItemClick(position, view);                Toast.makeText(mContext, "position:" + mData.get(i), Toast.LENGTH_SHORT).show();            }        });

    2.4、列表里面使用

    页面放一个RecyclerView

    <FrameLayout xmlns:android="Http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="match_parent"    tools:context=".nineLayout.NineImageLayoutActivity">    <androidx.recyclerview.widget.RecyclerView        android:id="@+id/recyclerview"        android:layout_width="match_parent"        android:layout_height="wrap_content" /></FrameLayout>

    item布局如下

    <?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:app="http://schemas.android.com/apk/res-auto"    android:layout_width="match_parent"    android:layout_height="wrap_content"    android:layout_margin="20dp">    <TextView        android:id="@+id/tv_title"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="标题"        android:textColor="@android:color/black"        android:textSize="18sp" />    <com.cyq.customview.nineLayout.view.NineImageLayout        android:id="@+id/nine_image_layout"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_below="@+id/tv_title"        android:layout_marginTop="20dp"        app:nine_imageGap="4dp"        app:nine_layoutWidth="300dp"        app:nine_singleImageWidth="180dp" /></RelativeLayout>

    Activity中构造一下测试数据,大致代码如下

    public class NineImageLayoutActivity extends AppCompatActivity {    private RecyclerView mRecyclerView;    private MyAdapter mAdapter;    private Random random;    private final String URL_IMG = "http://q3x62hkt1.bkt.clouddn.com/banner/58f57dfa5bb73.jpg";    private final String URL_IMG_2 = "http://q3x62hkt1.bkt.clouddn.com/timg.jpeg";    private List<List<String>> mList = new ArrayList<>();    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_nine_image_layout);        random = new Random();        List<String> testList = new ArrayList<>();        testList.add(URL_IMG_2);        for (int i = 0; i < 100; i++) {            int count = i % 9 + 1;            List<String> list = new ArrayList<>();            for (int j = 0; j < count; j++) {                list.add(URL_IMG);            }            if (i % 8 == 0) {                mList.add(testList);            }            mList.add(list);        }        mRecyclerView = findViewById(R.id.recyclerview);        mAdapter = new MyAdapter(mList, this);        mRecyclerView.setLayoutManager(new LinearLayoutManager(this));        mRecyclerView.setAdapter(mAdapter);    }}

    MyAdapter中设置数据

    import java.util.List;public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> {    private List<List<String>> mList;    private Context mContext;    public MyAdapter(List<List<String>> mList, Context mContext) {        this.mList = mList;        this.mContext = mContext;    }    @NonNull    @Override    public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {        View view = LayoutInflater.from(mContext).inflate(R.layout.item_nine_img_layout_list, parent, false);        return new MyViewHolder(view);    }    @Override    public void onBindViewHolder(@NonNull final MyViewHolder holder, final int position) {        final List<String> mData = mList.get(position);        holder.tvTitle.setText("这是" + mData.size() + "张图片的标题");        final NineImageLayout nineImageLayout = holder.nineImageLayout;        holder.nineImageLayout.setAdapter(new NineImageAdapter() {            @Override            protected int getItemCount() {                return mData.size();            }            @Override            protected View createView(LayoutInflater inflater, ViewGroup parent, int i) {                return inflater.inflate(R.layout.item_img_layout, parent, false);            }            @Override            protected void bindView(View view, final int i) {                final ImageView imageView = view.findViewById(R.id.iv_img);                Glide.with(mContext).load(mData.get(i)).into(imageView);                if (mData.size() == 1) {                    Glide.with(mContext)                            .asBitmap()                            .load(mData.get(0))                            .into(new SimpleTarget<Bitmap>() {                                @Override                                public void onResourceReady(Bitmap bitmap, Transition<? super Bitmap> transition) {                                    final int width = bitmap.getWidth();                                    final int height = bitmap.getHeight();                                    nineImageLayout.setSingleImage(width, height,imageView);                                }                            });                    Glide.with(mContext).load(mData.get(0)).into(imageView);                } else {                    Glide.with(mContext).load(mData.get(i)).into(imageView);                }            }            @Override            public void OnItemClick(int i, View view) {                super.OnItemClick(position, view);                Toast.makeText(mContext, "position:" + mData.get(i), Toast.LENGTH_SHORT).show();            }        });    }    @Override    public int getItemCount() {        return mList.size();    }     class MyViewHolder extends RecyclerView.ViewHolder {        TextView tvTitle;        NineImageLayout nineImageLayout;        public MyViewHolder(@NonNull View itemView) {            super(itemView);            tvTitle = itemView.findViewById(R.id.tv_title);            nineImageLayout = itemView.findViewById(R.id.nine_image_layout);        }    }}

    三、源码地址

    具体自定义NineImageLayout过程,可以查看NineImageLayout

    “Android如何自定义ViewGroup实现朋友圈九宫格控件”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

    --结束END--

    本文标题: Android如何自定义ViewGroup实现朋友圈九宫格控件

    本文链接: https://www.lsjlt.com/news/297929.html(转载时请注明来源链接)

    有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

    本篇文章演示代码以及资料文档资料下载

    下载Word文档到电脑,方便收藏和打印~

    下载Word文档
    猜你喜欢
    • Android自定义ViewGroup实现朋友圈九宫格控件
      目录一、简介 1.1、效果图如下1.2、主要功能如下二、使用 2.1、自定义属性如下2.2、布局中使用自定义NineImageLayout2.3、Adapter方式绑定数据和UI2....
      99+
      2024-04-02
    • Android如何自定义ViewGroup实现朋友圈九宫格控件
      本篇内容介绍了“Android如何自定义ViewGroup实现朋友圈九宫格控件”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!目录一、简介1、...
      99+
      2023-06-20
    • Android自定义控件实现九宫格解锁
      关于九宫格解锁,我看了不少博客,但是都感觉很复杂,可能我的功夫还不到,所以很多东西我不了解,但是我还是打算写一个自己的九宫格。我相信我的九宫格大家都能很快的理解,当然如果需要实现更复...
      99+
      2024-04-02
    • Android自定义控件实现九宫格解锁功能
      最终Android九宫格解锁效果如下进行定义实体point点public class Point { private float x; private float y; //正常模式 public static final int NORM...
      99+
      2023-05-31
      android 九宫格 解锁
    • Android自定义view实现滑动解锁九宫格控件
      目录前言需求效果图前言 上一篇文章用贝塞尔曲线画了一个看起来不错的小红点功能,技术上没什么难度,主要就是数学上的计算。这篇文章也差不多,模仿了一个常用的滑动解锁的九宫格控件。 需求 ...
      99+
      2023-02-09
      Android滑动解锁九宫格 Android滑动解锁 Android九宫格控件
    • Android自定义View实现九宫格图形解锁(Kotlin版)
      本文实例为大家分享了Android自定义View实现九宫格图形解锁的具体代码,供大家参考,具体内容如下 效果: 代码: package com.example.kotlin_t...
      99+
      2024-04-02
    • Android如何实现朋友圈多图显示功能
      小编给大家分享一下Android如何实现朋友圈多图显示功能,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!具体内容如下Android实现朋友圈评论回复列表Andro...
      99+
      2023-05-30
      android
    • Android如何实现九宫格手势密码
      这篇“Android如何实现九宫格手势密码”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Android如何实现九宫格手势密码...
      99+
      2023-07-02
    • Android如何实现仿微信朋友圈全文、收起功能
      小编给大家分享一下Android如何实现仿微信朋友圈全文、收起功能,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!效果图具体代码(详细解释在代码注释中都有,这里就省...
      99+
      2023-05-30
      android
    • Android如何自定义实现日历控件
      这篇文章主要介绍Android如何自定义实现日历控件,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!具体内容如下1. Calendar类2. 布局创建calendar_layout.xml<LinearLayou...
      99+
      2023-06-25
    • Android如何实现微信朋友圈图片和视频播放
      这篇文章主要介绍了Android如何实现微信朋友圈图片和视频播放,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。Android是什么Android是一种基于Linux内核的自由...
      99+
      2023-06-14
    • Android如何实现数字九宫格软键盘
      这篇文章主要介绍了Android如何实现数字九宫格软键盘,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。前言一开始大概是这种需求组长说 要不搞一个自定义软键盘吧 数字搞大点 方...
      99+
      2023-06-15
    • Android如何自定义ViewGroup实现堆叠头像的点赞Layout
      这篇文章给大家分享的是有关Android如何自定义ViewGroup实现堆叠头像的点赞Layout的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。实现自定义属性属性名说明默认值vertivalSpace行距4dpp...
      99+
      2023-05-30
      android viewgroup layout
    • Android自定义实现日历控件
      本文实例为大家分享了Android自定义实现日历控件的具体代码,供大家参考,具体内容如下 1. Calendar类 2. 布局 创建calendar_layout.xml <...
      99+
      2024-04-02
    • Android自定义控件实现时间轴
      本文实例为大家分享了Android自定义控件实现时间轴的具体代码,供大家参考,具体内容如下 由于项目中有需求,就简单的封装一个,先记录一下,有时间上传到github。 1、先增加自定...
      99+
      2024-04-02
    • Android 实现自定义折线图控件
      目录前言概述原点计算Y轴宽度计算X轴高度X轴绘制轴线X轴刻度间隔网格线、文本Y轴计算Y轴分布刻度间隔、网格线、文本折线代码前言 日前,有一个“折现图”的需求,...
      99+
      2024-04-02
    • WPF自定义控件如何实现
      今天小编给大家分享一下WPF自定义控件如何实现的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。方式一:基于现有控件进行扩展,如...
      99+
      2023-07-05
    • Android如何自定义评分控件
      今天小编给大家分享一下Android如何自定义评分控件的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。自定义参数为了方便扩展,...
      99+
      2023-06-30
    • android自定义控件如何实现简易时间轴
      这篇“android自定义控件如何实现简易时间轴”除了程序员外大部分人都不太理解,今天小编为了让大家更加理解“android自定义控件如何实现简易时间轴”,给大家总结了以下内容,具有一定借鉴价值,内容详细步骤清晰,细节处理妥当,希望大家通过...
      99+
      2023-06-28
    • Android如何实现一个倒计时自定义控件
      这篇“Android如何实现一个倒计时自定义控件”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Android如何实现一个倒计...
      99+
      2023-06-29
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作