短视频平台源码,动态上传的图片以九宫格形式展示

短视频平台源码,动态上传的图片以九宫格形式展示实现的相关代码

 

1
public abstract class NineGridAdapter {<br>    protected Context context;<br>    protected List list;<br>    public NineGridAdapter(Context context, List list) {<br>        this.context = context;<br>        this.list = list;<br>    }<br>    public abstract int getCount();<br>    public abstract String getUrl(int positopn);<br>    public abstract Object getItem(int position);<br>    public abstract long getItemId(int position);<br>    public abstract View getView(int i, View view);<br>}

 

自定义View多图控件

 

 

1
public class NineGridlayout extends ViewGroup {<br>    private NineGridAdapter adapter;<br>    private OnItemClickListerner onItemClickListerner;<br>    // 行间距<br>    private int lineSpace;<br>    //列间距<br>    private int gap;<br>    private final int DEFAULT_WIDTH = 140;<br>    private int columns;//<br>    private int rows;//<br>    private int totalWidth;<br>    private Context context;<br>    int singleWidth = 0, singleHeight = 0;<br>    private int defaultWidth, defaultHeight;<br>    private int oldCount;<br>    public NineGridlayout(Context context) {<br>        this(context, null);<br>    }<br>    public NineGridlayout(Context context, AttributeSet attrs) {<br>        this(context, attrs, 0);<br>    }<br>    public NineGridlayout(Context context, AttributeSet attrs, int defStyleAttr) {<br>        super(context, attrs, defStyleAttr);<br>        this.context = context;<br>        gap = dip2px(context, 10);<br>        lineSpace = dip2px(context,10);<br>        ViewGroup.LayoutParams lp = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,<br>                ViewGroup.LayoutParams.WRAP_CONTENT);<br>        defaultWidth = defaultHeight = dip2px(context, DEFAULT_WIDTH);<br>    }<br>    public void setDefaultWidth(int defaultWidth) {<br>        this.defaultWidth = defaultWidth;<br>    }<br>    public void setDefaultHeight(int defaultHeight) {<br>        this.defaultHeight = defaultHeight;<br>    }<br>    public void setAdapter(NineGridAdapter adapter) {<br>        this.adapter = adapter;<br>        if (adapter == null) {<br>            return;<br>        }<br>        //初始化布局形状<br>        generateChildrenLayout(adapter.getCount());<br>        //这里做一个重用view的处理<br>//        if (oldCount == 0) {<br>        removeAllViews();<br>        for (int i = 0; i < adapter.getCount(); i++) {<br>            View itemView = adapter.getView(i, null);<br>            addView(itemView, generateDefaultLayoutParams());<br>        }<br>//        }<br>         /*else {<br>            //以前添加过view<br>            int newViewCount = adapter.getCount();<br>            if (oldCount > newViewCount) {<br>                removeViews(newViewCount - 1, oldCount - newViewCount);<br>                for (int i = 0; i < newViewCount - 1; i++) {<br>                    adapter.getView(i, getChildAt(i));<br>                }<br>            } else if (oldCount < newViewCount) {<br>                for (int i = 0; i < newViewCount - oldCount; i++) {<br>                    View itemView = adapter.getView(i, null);<br>                    addView(itemView, generateDefaultLayoutParams());<br>                }<br>            }<br>        }*/<br>        oldCount = adapter.getCount();<br>        requestLayout();<br>    }<br>    @Override<br>    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {<br>        super.onMeasure(widthMeasureSpec, heightMeasureSpec);<br>        int widthMode = MeasureSpec.getMode(widthMeasureSpec);<br>        int heightMode = MeasureSpec.getMode(heightMeasureSpec);<br>        int sizeWidth = MeasureSpec.getSize(widthMeasureSpec);<br>        int sizeHeight = MeasureSpec.getSize(heightMeasureSpec);<br>        totalWidth = sizeWidth - getPaddingLeft() - getPaddingRight();<br>        if (adapter != null && adapter.getCount() > 0) {<br>            int measureWidth, measureHeight;<br>            int childrenCount = adapter.getCount();<br>            if (childrenCount == 1) {<br>                singleWidth = defaultWidth;<br>                singleHeight = defaultHeight;<br>            } else {<br>                singleWidth = (totalWidth - gap * (3 - 1)) / 3;<br>                singleHeight = singleWidth;<br>            }<br>            measureChildren(MeasureSpec.makeMeasureSpec(singleWidth, MeasureSpec.EXACTLY),<br>                    MeasureSpec.makeMeasureSpec(singleHeight, MeasureSpec.EXACTLY));<br>            measureWidth = singleWidth * columns + gap * (columns - 1);<br>            measureHeight = singleHeight * rows + lineSpace * (rows - 1);<br>            setMeasuredDimension(sizeWidth, measureHeight);<br>        }<br>    }<br>    @Override<br>    protected void onLayout(boolean changed, int l, int t, int r, int b) {<br>        layoutChildrenView();<br>    }<br>    private void layoutChildrenView() {<br>        if (adapter == null || adapter.getCount() == 0) {<br>            return;<br>        }<br>        int childrenCount = adapter.getCount();<br>        for (int i = 0; i < childrenCount; i++) {<br>            int[] position = findPosition(i);<br>            int left = (singleWidth + gap) * position[1] + getPaddingLeft();<br>            int top = (singleHeight + lineSpace) * position[0] + getPaddingTop();<br>            int right = left + singleWidth;<br>            int bottom = top + singleHeight;<br>            ImageView childrenView = (ImageView) getChildAt(i);<br>            if (childrenCount == 1) {<br>                //只有一张图片<br>                childrenView.setScaleType(ImageView.ScaleType.FIT_CENTER);<br>            } else {<br>                childrenView.setScaleType(ImageView.ScaleType.CENTER_CROP);<br>            }<br>            final int itemPosition = i;<br>            childrenView.setOnClickListener(new OnClickListener() {<br>                @Override<br>                public void onClick(View v) {<br>                    if (onItemClickListerner != null) {<br>                        onItemClickListerner.onItemClick(v, itemPosition);<br>                    }<br>                }<br>            });<br>            childrenView.layout(left, top, right, bottom);<br>        }<br>    }<br>    private int[] findPosition(int childNum) {<br>        int[] position = new int[2];<br>        for (int i = 0; i < rows; i++) {<br>            for (int j = 0; j < columns; j++) {<br>                if ((i * columns + j) == childNum) {<br>                    position[0] = i;//行<br>                    position[1] = j;//列<br>                    break;<br>                }<br>            }<br>        }<br>        return position;<br>    }<br>    public int getGap() {<br>        return gap;<br>    }<br>    public void setGap(int gap) {<br>        this.gap = gap;<br>    }<br>    /**<br>     * 根据图片个数确定行列数量<br>     * 对应关系如下<br>     * numrowcolumn<br>     * 1   11<br>     * 2   12<br>     * 3   13<br>     * 4   22<br>     * 5   23<br>     * 6   23<br>     * 7   33<br>     * 8   33<br>     * 9   33<br>     *<br>     * @param length<br>     */<br>    private void generateChildrenLayout(int length) {<br>        if (length <= 3) {<br>            rows = 1;<br>            columns = length;<br>        } else if (length <= 6) {<br>            rows = 2;<br>            columns = 3;<br>            if (length == 4) {<br>                columns = 2;<br>            }<br>        } else {<br>            rows = 3;<br>            columns = 3;<br>        }<br>    }<br>    /**<br>     * dp to px<br>     */<br>    public static int dip2px(Context context, double dpValue) {<br>        final float scale = context.getResources().getDisplayMetrics().density;<br>        return (int) (dpValue * scale + 0.5f);<br>    }<br>    public void setOnItemClickListerner(OnItemClickListerner onItemClickListerner) {<br>        this.onItemClickListerner = onItemClickListerner;<br>    }<br>    public interface OnItemClickListerner {<br>        public void onItemClick(View view, int position);<br>    }<br>}

 

以上就是短视频平台源码,动态上传的图片以九宫格形式展示实现的相关代码, 更多内容欢迎关注之后的文章

 

posted @   云豹科技-苏凌霄  阅读(110)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示