仿网易新闻栏目管理(频道管理)功能

AI漫剧制作全流程:豆包+Skill实现脚本到分镜的高效工作流 AI漫剧是短视频领域的新兴创作形态,它借助大语言模型、图像生成和视频生成技术,将传统动画制作链路压缩为“写清楚、画出来、动起来”三个环节。其核心并非依赖单一AI工具,而是通过提示词工程、分镜规范与工作流封装,实现从创意到成片的稳定输出。豆包作为大模型入口,负责理解需求并生成脚本与分镜描述;Skill则通过预制规则和结构化输出,解决通用对话随机性强的问题,让创作过程遵循标准SOP。这种组合显著降低了内容制作门槛,使没有绘画和编剧经验的创作者也能批量产出风格统一的漫剧。本文围绕豆包与Skill的协作机制,拆解脚 阅读详情

仿网易新闻客户端栏目的拖拽,删除,添加效果。在此要感谢vipra,此效果是在这个项目的基础上修改的

先上效果图:

简单说一下实现原理:

首先看一下效果图,分为上下两个GridView,上边的为可以拖拽的GridView,为DragGrid。下边是不可拖拽的普通的GridView。

主要说一下DragGrid(可以拖拽的GridView):重写onInterceptTouchEvent方法,然后设置Item的长按事件,拿到当前的item信息(postion,item的view),并在window层创建item的view的布局,在onTouchEvent方法,处理move事件获取到移动,计算item之间的移动和创建动画。

处理长按事件:

setOnItemLongClickListener(new OnItemLongClickListener() {
            @Override
            public boolean onItemLongClick(AdapterView<?> parent, View view,
                                           int position, long id) {
                int x = (int) ev.getX();// 长按事件的X位置
                int y = (int) ev.getY();// 长按事件的y位置

                startPosition = position;// 第一次点击的postion
                dragPosition = position;
                if (startPosition <= 0) {//TODO 原来是1
                    return false;
                }
                View dragViewGroup = getChildAt(dragPosition - getFirstVisiblePosition());
                TextView dragTextView = (TextView) dragViewGroup.findViewById(R.id.text_item);
                RelativeLayout ri_delete = (RelativeLayout) dragViewGroup.findViewById(R.id.ri_delete);
                dragTextView.setSelected(true);
                dragTextView.setEnabled(false);
                ri_delete.setVisibility(View.INVISIBLE);
                itemHeight = dragViewGroup.getHeight();
                itemWidth = dragViewGroup.getWidth();
                itemTotalCount = DragGrid.this.getCount();
                int row = itemTotalCount / nColumns;// 算出行数
                Remainder = (itemTotalCount % nColumns);// 算出最后一行多余的数量
                if (Remainder != 0) {
                    nRows = row + 1;
                } else {
                    nRows = row;
                }

                // 如果特殊的这个不等于拖动的那个,并且不等于-1
                if (dragPosition != AdapterView.INVALID_POSITION) {
                    // 释放的资源使用的绘图缓存。如果你调用buildDrawingCache()手动没有调用setDrawingCacheEnabled(真正的),你应该清理缓存使用这种方法。
                    win_view_x = windowX - dragViewGroup.getLeft();//VIEW相对自己的X,半斤
                    win_view_y = windowY - dragViewGroup.getTop();//VIEW相对自己的y,半斤
                    dragOffsetX = (int) (ev.getRawX() - x);//手指在屏幕的上X位置-手指在控件中的位置就是距离最左边的距离
                    dragOffsetY = (int) (ev.getRawY() - y);//手指在屏幕的上y位置-手指在控件中的位置就是距离最上边的距离
//					dragItemView = dragViewGroup;

                    dragViewGroup.destroyDrawingCache();
                    if (ri_delete.getVisibility() == View.GONE) {
                        ri_delete.setVisibility(View.VISIBLE);
                    }
                    dragViewGroup.setDrawingCacheEnabled(true);
                    //TODO 展示删除按钮
                    showInnerDeleteIcon();
                    showDeleteIcon(true);

                    Bitmap dragBitmap = Bitmap.createBitmap(dragViewGroup.getDrawingCache());
                    //mVibrator.vibrate(50);//设置震动时间
                    startDrag(dragBitmap, (int) ev.getRawX(), (int) ev.getRawY());
                    //隐藏需要移动的item
                    hideDropItem();
                    dragViewGroup.setVisibility(View.INVISIBLE);

                    isMoving = false;
                    requestDisallowInterceptTouchEvent(true);
                    return true;
                }
                return false;
            }
        });
处理移动:

        // 拖动的VIEW下方的POSTION
        int dPosition = pointToPosition(x, y);
        // 判断下方的POSTION是否是最开始2个不能拖动的
        if (dPosition > 0) {//TODO 原来值是1
            if ((dPosition == -1) || (dPosition == dragPosition)) {
                return;
            }
            dropPosition = dPosition;
            if (dragPosition != startPosition) {
                dragPosition = startPosition;
            }
            int movecount;
            //拖动的=开始拖的,并且 拖动的 不等于放下的
            if ((dragPosition == startPosition) || (dragPosition != dropPosition)) {
                //移需要移动的动ITEM数量
                movecount = dropPosition - dragPosition;
            } else {
                //移需要移动的动ITEM数量为0
                movecount = 0;
            }
            if (movecount == 0) {
                return;
            }

            int movecount_abs = Math.abs(movecount);

            if (dPosition != dragPosition) {
                //dragGroup设置为不可见
                ViewGroup dragGroup = (ViewGroup) getChildAt(dragPosition);
                dragGroup.setVisibility(View.INVISIBLE);
                float to_x = 1;// 当前下方positon
                float to_y;// 当前下方右边positon
                //x_vlaue移动的距离百分比(相对于自己长度的百分比)
                float x_vlaue = ((float) mHorizontalSpacing / (float) itemWidth) + 1.0f;
                //y_vlaue移动的距离百分比(相对于自己宽度的百分比)
                float y_vlaue = ((float) mVerticalSpacing / (float) itemHeight) + 1.0f;
                Log.d("x_vlaue", "x_vlaue = " + x_vlaue);
                for (int i = 0; i < movecount_abs; i++) {
                    to_x = x_vlaue;
                    to_y = y_vlaue;
                    //像左
                    if (movecount > 0) {
                        // 判断是不是同一行的
                        holdPosition = dragPosition + i + 1;
                        if (dragPosition / nColumns == holdPosition / nColumns) {
                            to_x = -x_vlaue;
                            to_y = 0;
                        } else if (holdPosition % 4 == 0) {
                            to_x = 3 * x_vlaue;
                            to_y = -y_vlaue;
                            System.out.println("=============to_y ="+to_y);
                        } else {
                            to_x = -x_vlaue;
                            to_y = 0;
                        }
                    } else {
                        //向右,下移到上,右移到左
                        holdPosition = dragPosition - i - 1;
                        if (dragPosition / nColumns == holdPosition / nColumns) {
                            to_x = x_vlaue;
                            to_y = 0;
                        } else if ((holdPosition + 1) % 4 == 0) {
                            to_x = -3 * x_vlaue;
                            to_y = y_vlaue;
                        } else {
                            to_x = x_vlaue;
                            to_y = 0;
                        }
                    }
                    ViewGroup moveViewGroup = (ViewGroup) getChildAt(holdPosition);
                    Animation moveAnimation = getMoveAnimation(to_x, to_y);
                    moveViewGroup.startAnimation(moveAnimation);
                    //如果是最后一个移动的,那么设置他的最后个动画ID为LastAnimationID
                    if (holdPosition == dropPosition) {
                        LastAnimationID = moveAnimation.toString();
                    }
                    moveAnimation.setAnimationListener(new AnimationListener() {

                        @Override
                        public void onAnimationStart(Animation animation) {
                            isMoving = true;
                        }

                        @Override
                        public void onAnimationRepeat(Animation animation) {

                        }

                        @Override
                        public void onAnimationEnd(Animation animation) {
                            // 如果为最后个动画结束,那执行下面的方法
                            if (animation.toString().equalsIgnoreCase(LastAnimationID)) {
                                DragAdapter mDragAdapter = (DragAdapter) getAdapter();
                                mDragAdapter.exchange(startPosition, dropPosition);
                                startPosition = dropPosition;
                                dragPosition = dropPosition;
                                isMoving = false;
                            }
                        }
                    });
                }
            }
        }
 


如此,当点击下边的GridView,获取到当前item的位置,然后获取到上传size+1的位置,创建window层view,设置动画。

具体代码可以去我的github自己去看。

项目下载地址:https://github.com/whatshappen/TopGrid


新闻APP源码项目实战:微信小程序开发与解析 本章深入探讨了新闻类APP的UI设计与实现方式,从设计原则到具体组件实现,从首页布局到详情页交互,再到主题与样式管理,全面覆盖了新闻APP前端开发的核心内容。每一部分均提供了可落地的代码实现、参数说明与流程图辅助理解,帮助开发者构建高质量、高体验的新闻应用。 阅读详情

相关推荐

新闻客户端App界面UI设计完整参考与实战指南

部分头部App(如今日头条)采用圆角矩形+扁平化风格图标,与其整体UI语言统一。自定义设计需注意:- 保持线条粗细一致(推荐2px strokeWidth)- 角度对齐网格(避免斜线偏差)- 负空间均衡分布建议建立SVG图标库并通过Icon Font或Symbol Sprite集中管理,提升加载效率与维护便利性。最终目标是让图标不仅“看得懂”,更能“记得住”,成为品牌资产的一部分。

weixin_35835030的博客 1269

Android 高仿 频道管理----网易、今日头条、腾讯视频 (可以拖动的GridView)附源码DEMO...

距离上次发布(android高仿系列)今日头条 --新闻阅读器 (二) 相关的内容已经半个月了,最近利用空闲时间,把今日头条客户端完善了下。完善的功能一个一个全部实现后,就放整个源码。开发的进度就是按照一个一个功能的思路走的,所以开发一个小的功能,如果有用,就写一个专门的博客以便有人用到独立的功能可以方便使用。 这次实现的功能是很多新闻阅读器(网易,今日头条,360新闻等)以及腾讯视频等里...

xumingrencai 662

仿网易新闻App

NULL 博文链接:https://xwangly.iteye.com/blog/2021667

Android 高仿 频道管理----网易、今日头条、腾讯视频 (可以拖动的GridView)附源码DEMO

距离上次发布(android高仿系列)今日头条 --新闻阅读器 (二) 相关的内容已经半个月了,最近利用空闲时间,把今日头条客户端完善了下。完善的功能一个一个全部实现后,就放整个源码。开发的进度就是按照一个一个功能的思路走的,所以开发一个小的功能,如果有用,就写一个专门的博客以便有人用到独立的功能可以方便使用。 这次实现的功能是很多新闻阅读器(网易,今日头条,360新闻等)以及腾讯视频等里

lzq520210的博客 816

android 高仿 频道管理----网易、今日头条、腾讯视频 (可以拖动的GridView)

这次实现的功能是很多新闻阅读器(网易,今日头条,360新闻等)以及腾讯视频等里面都会出现的频道管理功能。 对应博文地址:http://blog.youkuaiyun.com/vipzjyno1/article/details/25005851

Android 高仿网易新闻(可以拖动的GridView)附源码DEMO

Android 高仿 频道管理----网易、今日头条、腾讯视频 (可以拖动的GridView)附源码DEMO,有动画效果

新闻频道管理的炫酷实现

自定义GridLayout控件,可以在新闻咨询类APP中的管理页面使用到,也可以应用在类别管理中,总之,可以帮助我们设计更加规范和炫酷的手机页面。新闻类app是最常见的应用之一,而频道管理又是其必不可少的功能,该自定义控件不仅可以带我们实现炫酷的频道管理功能,还可以让我们学习如何使用Android拖拽框架实现我们想要的多种功能,以及让我们对自定义控件会有更多的理解。

JackChan 1106

仿头条、网易新闻频道管理

移动端 频道管理拖动、随意编排你想要的频道,筛选你感性群的内容

android 高仿网易新闻,Android实战:仿网易新闻app--简介

最近写了一个简单的新闻app客户端,仿网易新闻的,实时获取网易新闻客户端的数据。话不多说,先上图。1.gif2.gif图片浏览.gif新闻详情页.gif5.gif视频播放.gif项目结构项目结构FragmentTabHost + TabLayout + viewpager + Toolbar + fragment即最外层使用FragmentTabHost作为底部标签栏。然后第二层嵌套TabLayo...

weixin_31269713的博客 531

Android 仿今日头条频道管理 (全)(GridView的Item移动、拖拽)

Android 仿今日头条项目的频道管理,GridView的移动和拖拽、超强的交互体验 、详情见博客:http://blog.youkuaiyun.com/u011916937

高仿新闻类APP频道管理功能,ItemTouchHelper的实践

高仿新闻类APP频道管理功能,参考博客http://blog.youkuaiyun.com/Iamzgx/article/details/52843653

自定义ViewGroup之仿网易新闻栏目管理

先占坑: 遇到的坑: 1.在子view结束动画后,需要clearAnimation(),因为Animation.setFillAfter(true);执行动画后,数据有变动了 ,再notify时也不会消除上一次动画的影响,造成错位。 2. 动画结束才真实交换位置。但会造成两次动画,因为动画没结束,prePos和mTempPos没变化,会再次触发动画。 3.app主题为actionb

Ulez_柚子的博客 1413

仿 网易新闻客户端 滑动导航.rar

仿 网易新闻客户端 滑动导航.rar

门户网站涉及栏目

谈到门户网站时,大家首先想到的是新浪、搜狐、网易、腾讯、雅虎这些品牌网站,他们主要提供新闻、搜索引擎、免费邮箱、影音资讯、电子商务、网络游戏等等。                                       我们从门户网站的定义来看:

白璐 | 产品经理 3008

高通Camera AWB跳变问题实战:从夕阳场景到参数调优的完整避坑指南

本文深入解析高通Camera AWB跳变问题,特别是在夕阳场景下的色温突变现象。通过分析灰区统计失效、光源混合干扰等成因,提供从参数调优到诊断工具链的完整解决方案,包括动态灰区扩展算法、色温平滑过渡方案及高通平台特定优化技巧,帮助工程师有效解决AWB跳变问题。

sre5engineer的博客 858

ubuntu安装eigen3.3.7

查看已安装版本: gedit /usr/include/eigen3/Eigen/src/Core/util/Macros.h 或 gedit /usr/local/include/eigen3/Eigen/src/Core/util/Macros.h 卸载先前版本: sudo updatedb locate eigen3 得到eigen库的位置 卸载: sudo rm -rf /usr/include/eigen3 /usr/lib/cmake/eigen3 ...

reason的博客 1万+

RecyclerView学习(二)----高仿网易新闻栏目动画效果

*本篇文章已授权微信公众号 guolin_blog (郭霖)独家发布 之前用TabLayout+RecyclerView实现了优快云客户端首页搭建与Tabs的排序。今天准备用RecyclerView来实现网易新闻Tabs的动态效果。先看效果图: 点击下面的RecyclerView的item,会有一个view的移动的动画;...

weixin_34390996的博客 330

ARCGIS绘制全国各省PM2.5浓度图操作步骤

ArcGIS新手小白一枚,经常需要帮助老师绘制一些简单的空间图,利用ArcGIS绘制全国各省的pm2.5浓度图,简单又方便,不记下来会忘记~

weixin_43458484的博客 1万+

以网易为例,手把手教你制作产品帮助中心

在讨论制作产品帮助中心前,我们先了解什么是帮助中心,帮助中心即帮助用户解决直接解决问题的平台,网易是中国领先的互联网技术公司,为用户提供免费邮箱、游戏、搜索引擎服务,开设新闻、娱乐、体育等30多个内容频道,本文以网易帮助中心为例,手把手教你制作产品帮助中心。 首先我们来参考一下网易的帮助中心是什么样的。网易的帮助中心分了很多个板块,将旗下各类产品分类展示,用户可以快速找到自己需要咨询的产品。 在点进去相关产品的时候,这里以Lofter为例,可以清晰的看到这个页面被分为了5个板块:引流到Lofer注册

qzhida的博客 622

Mamba与iTransformer融合:时间序列预测中的曼巴注意力机制创新实践

本文探讨了Mamba与iTransformer融合在时间序列预测中的创新实践,重点介绍了曼巴注意力机制的设计与优势。通过双路径信息流设计,该方案在保持O(n)复杂度的同时,显著提升了预测精度和训练效率。实验证明,混合架构在电力负荷、气象数据等多变量长序列场景中表现优异,预测误差降低至0.083,内存占用仅4.2GB。

weixin_29292535的博客 219

手机安装Kali Linux

在数字化时代,信息安全和隐私保护显得尤为重要。,作为一款专业的和工具,因其强大的功能和丰富的资源库而受到广大安全研究者和爱好者的青睐。然而,我们通常只能在传统的电脑设备上安装和使用Kali Linux。那么,有没有可能将也变成一款随身携带的Kali Linux设备呢?答案是肯定的。本文将介绍如何在手机上安装Kali Linux,使你的手机变成一款强大的移动安全工具。,我们需要明确一点,手机安装Kali Linux并非简单的操作,需要对手机进行一定的改造和配置。

2301_80124151的博客 6964

android标签可拖拽,flowlayout - 流式布局,云标签,可拖拽,显示交换位置时的动画...

flowlayout简介: 类似网易新闻、今日头条,频道标签排序删除等处理功能怎样配置: 在您gradle中allprojects {repositories {maven { url 'https://jitpack.io' }}}dependencies {implementation 'com.github.cydeep:flowlayout:v1.2.1'}效果图 怎样使用:在布局文件中a...

weixin_39982933的博客 603

极空间NAS小白也能搞定的Gitea部署:Docker+MySQL避坑全记录

本文为极空间NAS用户提供了一份详尽的Gitea私有代码仓库部署指南。针对极空间ARM架构和图形化Docker管理的特殊性,文章重点讲解了如何通过Docker和MySQL容器进行部署,并提供了三种获取兼容镜像的实战策略,特别是利用第三方镜像站转录的方法,帮助小白用户成功搭建并初始化Gitea服务,实现私有Git托管。

weixin_28318011的博客 366
上一篇: 解决android数据库并发访问异常
下一篇: RecyclerView嵌套GridView,RecyclerView的第一个item显示不全
wangw-csdn
博客等级 码龄11年 23粉丝 24原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值