• Android 仿 新闻阅读器 菜单弹出效果(附源码DEMO)


    这一系列博文都是:(android高仿系列)今日头条 --新闻阅读器 (一)

    开发中碰到问题之后实现的,觉得可能有的开发者用的到或则希望独立成一个小功能DEMO,所以就放出来这么一个DEMO。

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

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

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

    下面看看代码的思路:

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

    public class MyAdapter extends BaseAdapter {
        LayoutInflater inflater = null;
        Activity activity;
        ArrayList<News> newslist;
        private PopupWindow popupWindow;
    
        public MyAdapter(Activity activity, ArrayList<News> newslist) {
            this.activity = activity;
            this.newslist = newslist;
            inflater = (LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            initPopWindow();
        }
    
        @Override
        public int getCount() {
            return newslist != null ? newslist.size() : 0;
        }
    
        @Override
        public News getItem(int position) {
            if (newslist != null && newslist.size() != 0) {
                return newslist.get(position);
            }
            return null;
        }
    
        @Override
        public long getItemId(int position) {
            return position;
        }
    
        @Override
        public View getView(final int position, View convertView, ViewGroup parent) {
            View vi = convertView;
            final ViewHolder holder;
            if (vi == null) {
                vi = inflater.inflate(R.layout.listview_item, null);
                holder = new ViewHolder();
                holder.item_title = (TextView) vi.findViewById(R.id.item_title);
                holder.item_content = (TextView) vi.findViewById(R.id.item_content);
                holder.button_showpop = (ImageView) vi.findViewById(R.id.button_showpop);
                vi.setTag(holder);
            } else {
                holder = (ViewHolder) vi.getTag();
            }
            News news = getItem(position);
            holder.item_title.setText(news.getTitle());
            holder.item_content.setText(news.getContent());
            holder.button_showpop .setOnClickListener(new popAction(position));
            return vi;
        }
    
        public class ViewHolder {
            TextView item_title;
            TextView item_content;
            ImageView button_showpop;
        }
        
        /** 
         * 初始化popWindow
         * */
        private void initPopWindow() {
            View popView = inflater.inflate(R.layout.listview_pop, null);
            popupWindow = new PopupWindow(popView, LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
            popupWindow.setBackgroundDrawable(new ColorDrawable(0));
            //设置popwindow出现和消失动画
            popupWindow.setAnimationStyle(R.style.PopMenuAnimation);
            btn_pop_close = (ImageView) popView.findViewById(R.id.btn_pop_close);
        }
        
        /** popWindow 关闭按钮 */
        private ImageView btn_pop_close;
        
        /** 
         * 显示popWindow
         * */
        public void showPop(View parent, int x, int y,int postion) {
            //设置popwindow显示位置
            popupWindow.showAtLocation(parent, 0, x, y);
            //获取popwindow焦点
            popupWindow.setFocusable(true);
            //设置popwindow如果点击外面区域,便关闭。
            popupWindow.setOutsideTouchable(true);
            popupWindow.update();
            if (popupWindow.isShowing()) {
                
            }
            btn_pop_close.setOnClickListener(new OnClickListener() {
                public void onClick(View paramView) {
                    popupWindow.dismiss();
                }
            });
        }
        
        /** 
         * 每个ITEM中more按钮对应的点击动作
         * */
        public class popAction implements OnClickListener{
            int position;
            public popAction(int position){
                this.position = position;
            }
            @Override
            public void onClick(View v) {
                int[] arrayOfInt = new int[2];
                //获取点击按钮的坐标
                v.getLocationOnScreen(arrayOfInt);
                int x = arrayOfInt[0];
                int y = arrayOfInt[1];
                showPop(v, x , y, position);
            }
        }
    }

    就这么多的内容,很简单,日后碰到这类相关的效果,也就不用怕了。

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



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

  • 相关阅读:
    Wannafly挑战赛29-A/B
    hdu-4819-线段树套线段树
    CF-877E-线段树+哈希
    CF-413E-线段树
    CF-787D-线段树建图+最短路
    CF-339D-线段树
    2017.4.26 慕课网--Java 高并发秒杀API配置文件(持续更新)
    2017.4.26 慕课网--Java 高并发秒杀API(一)
    2017.4.19 慕课网-通过自动回复机器人学习mybatis
    2017.4.18 linux中执行某文件提示权限不够
  • 原文地址:https://www.cnblogs.com/zhujiabin/p/8144771.html
Copyright © 2020-2023  润新知