zoukankan      html  css  js  c++  java
  • Android仿QQ复制昵称效果

    本文同步自http://javaexception.com/archives/76

    背景:

    这几天做一个复制文本的需求,突然看到QQ上复制昵称跟QQ号的效果,觉得很不错,就想要模仿一波,办法比较简单粗暴,反编译QQ获取了那个.9图片,然后就是用PopWindow实现了。

    解决办法:

    自定义PopWindow

    public class CopyContentPopWindow extends PopupWindow {
     
        private final View content;
        TextView tvLabel;
        TextView tvLabelFake;
        Activity context;
        private OnCopyContentListener onCopyContentListener;
     
        public CopyContentPopWindow(Activity context) {
            LayoutInflater inflater = (LayoutInflater) context
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            content = inflater.inflate(R.layout.popwindow_copy_content, null);
            tvLabel = content.findViewById(R.id.tv_label);
            tvLabelFake = content.findViewById(R.id.tv_label_fake);
            tvLabel.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    if (onCopyContentListener != null) {
                        onCopyContentListener.copyContent();
                    }
                    CopyContentPopWindow.this.dismiss();
                }
            });
            this.setContentView(content);
            this.setWidth(ViewGroup.LayoutParams.WRAP_CONTENT);
            this.setHeight(ViewGroup.LayoutParams.WRAP_CONTENT);
            this.setFocusable(true);
            this.setOutsideTouchable(true);
            this.update();
            ColorDrawable dw = new ColorDrawable(0000000000);
            this.setBackgroundDrawable(dw);
            this.context = context;
        }
     
        public void setTvLabel(String text) {
            tvLabel.setText(text);
            tvLabelFake.setText(text);
            update();
        }
     
        public void setOnCopyContentListener(OnCopyContentListener onCopyContentListener) {
            this.onCopyContentListener = onCopyContentListener;
        }
     
        public void showPopupWindow(View parent) {
            if (!this.isShowing()) {
                int[] location = new int[2];
                parent.getLocationOnScreen(location);
    //            this.showAsDropDown(parent, 0, 0);
                showAtLocation(parent, Gravity.NO_GRAVITY, location[0], location[1]);
            } else {
                this.dismiss();
            }
        }
     
        public interface OnCopyContentListener {
            void copyContent();
        }
    }

    具体使用代码:

    public class MainActivity extends AppCompatActivity {
     
        TextView tvNickName;
        TextView tvQQNum;
     
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            tvNickName = findViewById(R.id.tv_nick_name);
            tvQQNum = findViewById(R.id.tv_qq_num);
            tvNickName.setOnClickListener(v -> {
                CopyContentPopWindow copyContentPopWindow = new CopyContentPopWindow(MainActivity.this);
                copyContentPopWindow.setTvLabel("复制");
                copyContentPopWindow.setOnCopyContentListener(() -> {
                    ClipboardManager cm = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
                    ClipData clipData = ClipData.newPlainText("Label", tvNickName.getText().toString());
                    cm.setPrimaryClip(clipData);
                    Toast.makeText(MainActivity.this, "复制成功", Toast.LENGTH_LONG).show();
                });
                copyContentPopWindow.showPopupWindow(tvNickName);
            });
     
            tvQQNum.setOnClickListener(v -> {
                CopyContentPopWindow copyContentPopWindow = new CopyContentPopWindow(MainActivity.this);
                copyContentPopWindow.setTvLabel("复制QQ号");
                copyContentPopWindow.setOnCopyContentListener(() -> {
                    ClipboardManager cm = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
                    ClipData clipData = ClipData.newPlainText("Label", "100001");
                    cm.setPrimaryClip(clipData);
                    Toast.makeText(MainActivity.this, "复制成功", Toast.LENGTH_LONG).show();
                });
                copyContentPopWindow.showPopupWindow(tvQQNum);
            });
        }
    }

    代码下载地址

    链接:https://pan.baidu.com/s/1jChJvQ9i6JrfFqwU3q1Mtg 密码:lsf7

    其他相关

    同事找到了一个不错的开源项目,https://github.com/shangmingchao/PopupList 突然觉得这个用起来更容易,下篇来写。

    
    
    
  • 相关阅读:
    CSS魔法堂:重拾Border之——更广阔的遐想
    CSS魔法堂:重拾Border之——不仅仅是圆角
    CSS魔法堂:重拾Border之——图片作边框
    CSS魔法堂:重拾Border之——解构Border
    CSS3魔法堂:说说Multi-column Layout
    CSS魔法堂:"那不是bug,是你不懂我!" by inline-block
    CSS魔法堂:小结一下Box Model与Positioning Scheme
    CSS魔法堂:说说Float那个被埋没的志向
    CSS魔法堂:你一定误解过的Normal flow
    CSS魔法堂:Absolute Positioning就这个样
  • 原文地址:https://www.cnblogs.com/xing-star/p/10798098.html
Copyright © 2011-2022 走看看