仿今日头条滑动评论效果

简介: 开发中碰到问题之后实现的,觉得可能有的开发者用的到或则希望独立成一个小功能DEMO,所以就放出来这么一个DEMO。 原本觉得是最后完成后发网站客户端的,可是这样体现不出一个功能一个功能的分析实现效果,而且周期时间长,所以就完成一部分,发一部分,敬请谅解。 下面的菜单弹出效果在很多的新闻阅读器上都有,比如今日头条、360新闻等。下 其实这个实现起来很简单,看其效果,其实就是一个
开发中碰到问题之后实现的,觉得可能有的开发者用的到或则希望独立成一个小功能DEMO,所以就放出来这么一个DEMO。

原本觉得是最后完成后发网站客户端的,可是这样体现不出一个功能一个功能的分析实现效果,而且周期时间长,所以就完成一部分,发一部分,敬请谅解。


下面的菜单弹出效果在很多的新闻阅读器上都有,比如今日头条、360新闻等。下

其实这个实现起来很简单,看其效果,其实就是一个PopupWindow,之后设定相应postion的按钮点击属性,之后获取按钮的位置,给它设置动画显示消失就可以出现了。

下面看看代码的思路:

由于整体是一个LISTVIEW,所以我把点击的事件写到了对应的Adapter适配器中。

  1. public class MyAdapter extends BaseAdapter {  
  2.     LayoutInflater inflater = null;  
  3.     Activity activity;  
  4.     ArrayList<News> newslist;  
  5.     private PopupWindow popupWindow;  
  6.   
  7.     public MyAdapter(Activity activity, ArrayList<News> newslist) {  
  8.         this.activity = activity;  
  9.         this.newslist = newslist;  
  10.         inflater = (LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);  
  11.         initPopWindow();  
  12.     }  
  13.   
  14.     @Override  
  15.     public int getCount() {  
  16.         return newslist != null ? newslist.size() : 0;  
  17.     }  
  18.   
  19.     @Override  
  20.     public News getItem(int position) {  
  21.         if (newslist != null && newslist.size() != 0) {  
  22.             return newslist.get(position);  
  23.         }  
  24.         return null;  
  25.     }  
  26.   
  27.     @Override  
  28.     public long getItemId(int position) {  
  29.         return position;  
  30.     }  
  31.   
  32.     @Override  
  33.     public View getView(final int position, View convertView, ViewGroup parent) {  
  34.         View vi = convertView;  
  35.         final ViewHolder holder;  
  36.         if (vi == null) {  
  37.             vi = inflater.inflate(R.layout.listview_item, null);  
  38.             holder = new ViewHolder();  
  39.             holder.item_title = (TextView) vi.findViewById(R.id.item_title);  
  40.             holder.item_content = (TextView) vi.findViewById(R.id.item_content);  
  41.             holder.button_showpop = (ImageView) vi.findViewById(R.id.button_showpop);  
  42.             vi.setTag(holder);  
  43.         } else {  
  44.             holder = (ViewHolder) vi.getTag();  
  45.         }  
  46.         News news = getItem(position);  
  47.         holder.item_title.setText(news.getTitle());  
  48.         holder.item_content.setText(news.getContent());  
  49.         holder.button_showpop .setOnClickListener(new popAction(position));  
  50.         return vi;  
  51.     }  
  52.   
  53.     public class ViewHolder {  
  54.         TextView item_title;  
  55.         TextView item_content;  
  56.         ImageView button_showpop;  
  57.     }  
  58.       
  59.     /**  
  60.      * 初始化popWindow 
  61.      * */  
  62.     private void initPopWindow() {  
  63.         View popView = inflater.inflate(R.layout.listview_pop, null);  
  64.         popupWindow = new PopupWindow(popView, LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);  
  65.         popupWindow.setBackgroundDrawable(new ColorDrawable(0));  
  66.         //设置popwindow出现和消失动画  
  67.         popupWindow.setAnimationStyle(R.style.PopMenuAnimation);  
  68.         btn_pop_close = (ImageView) popView.findViewById(R.id.btn_pop_close);  
  69.     }  
  70.       
  71.     /** popWindow 关闭按钮 */  
  72.     private ImageView btn_pop_close;  
  73.       
  74.     /**  
  75.      * 显示popWindow 
  76.      * */  
  77.     public void showPop(View parent, int x, int y,int postion) {  
  78.         //设置popwindow显示位置  
  79.         popupWindow.showAtLocation(parent, 0, x, y);  
  80.         //获取popwindow焦点  
  81.         popupWindow.setFocusable(true);  
  82.         //设置popwindow如果点击外面区域,便关闭。  
  83.         popupWindow.setOutsideTouchable(true);  
  84.         popupWindow.update();  
  85.         if (popupWindow.isShowing()) {  
  86.               
  87.         }  
  88.         btn_pop_close.setOnClickListener(new OnClickListener() {  
  89.             public void onClick(View paramView) {  
  90.                 popupWindow.dismiss();  
  91.             }  
  92.         });  
  93.     }  
  94.       
  95.     /**  
  96.      * 每个ITEM中more按钮对应的点击动作 
  97.      * */  
  98.     public class popAction implements OnClickListener{  
  99.         int position;  
  100.         public popAction(int position){  
  101.             this.position = position;  
  102.         }  
  103.         @Override  
  104.         public void onClick(View v) {  
  105.             int[] arrayOfInt = new int[2];  
  106.             //获取点击按钮的坐标  
  107.             v.getLocationOnScreen(arrayOfInt);  
  108.             int x = arrayOfInt[0];  
  109.             int y = arrayOfInt[1];  
  110.             showPop(v, x , y, position);  
  111.         }  
  112.     }  
  113. }  
就这么多的内容,很简单,日后碰到这类相关的效果,也就不用怕了。

下面是我经过上述代码实现的效果:



下面放上该效果源码DEMO的下载地址:下载地址

目录
相关文章
|
2天前
|
云安全 人工智能
2025,阿里云安全的“年度报告”
拥抱AI时代,阿里云安全为你护航~
1439 1
|
9天前
|
云安全 人工智能 算法
以“AI对抗AI”,阿里云验证码进入2.0时代
三层立体防护,用大模型打赢人机攻防战
1417 10
|
9天前
|
机器学习/深度学习 安全 API
MAI-UI 开源:通用 GUI 智能体基座登顶 SOTA!
MAI-UI是通义实验室推出的全尺寸GUI智能体基座模型,原生集成用户交互、MCP工具调用与端云协同能力。支持跨App操作、模糊语义理解与主动提问澄清,通过大规模在线强化学习实现复杂任务自动化,在出行、办公等高频场景中表现卓越,已登顶ScreenSpot-Pro、MobileWorld等多项SOTA评测。
1330 7
|
10天前
|
人工智能 Rust 运维
这个神器让你白嫖ClaudeOpus 4.5,Gemini 3!还能接Claude Code等任意平台
加我进AI讨论学习群,公众号右下角“联系方式”文末有老金的 开源知识库地址·全免费
1216 15
|
4天前
|
人工智能 前端开发 API
Google发布50页AI Agent白皮书,老金帮你提炼10个核心要点
老金分享Google最新AI Agent指南:让AI从“动嘴”到“动手”。Agent=大脑(模型)+手(工具)+协调系统,可自主完成任务。通过ReAct模式、多Agent协作与RAG等技术,实现真正自动化。入门推荐LangChain,文末附开源知识库链接。
457 118
|
2天前
|
机器学习/深度学习 测试技术 数据中心
九坤量化开源IQuest-Coder-V1,代码大模型进入“流式”训练时代
2026年首日,九坤创始团队成立的至知创新研究院开源IQuest-Coder-V1系列代码大模型,涵盖7B至40B参数,支持128K上下文与GQA架构,提供Base、Instruct、Thinking及Loop版本。采用创新Code-Flow训练范式,模拟代码演化全过程,提升复杂任务推理能力,在SWE-Bench、LiveCodeBench等基准领先。全阶段checkpoint开放,支持本地部署与微调,助力研究与应用落地。
338 1
|
7天前
|
存储 缓存 NoSQL
阿里云经济型e实例(ecs.e-c1m4.large)2核8G云服务器优惠活动价格及性能测评
阿里云经济型e实例(ecs.e-c1m4.large)2核8G配置,支持按使用流量或按固定带宽两种公网计费方式,搭配20G起ESSD Entry云盘,是主打高性价比的内存优化型入门选择。其核心特点是8G大内存适配轻量内存密集场景,计费模式灵活可控,既能满足个人开发者的复杂测试项目需求,也能支撑小微企业的基础业务运行,无需为闲置资源过度付费。以下从优惠活动价格、性能表现、适用场景及避坑要点四方面,用通俗语言详细解析。
233 153
|
4天前
|
机器学习/深度学习 人工智能 算法
炎鹊「Nexus Agent V1.0」:垂直领域AI应用的原生能力引擎
炎鹊AI「Nexus Agent V1.0」是垂直行业专属AI原生引擎,融合大模型、AIGA决策大脑、行业知识图谱与专属模型,打造“感知-决策-执行”闭环。支持21个行业低代码构建工具型、员工型、决策型AI应用,实现技术到业务价值的高效转化,推动AI从实验走向规模化落地。(239字)
253 1

热门文章

最新文章