• 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 突然觉得这个用起来更容易,下篇来写。

    
    
    
  • 相关阅读:
    分享一个文字转成语音的工具,视频配音神器
    生手linux服务器维护常用命令记录
    信不信?各种红包App最后都会整合游戏!App+游戏的变现模式分析
    一个玩游戏的失足青年,转行做游戏开发到教育的痛苦挣扎过程(4)
    免费送!CocosCreator 6.1超级大礼包!
    一个玩游戏的失足青年,转行做游戏开发到教育的痛苦挣扎过程(3)
    【激励视频组件】零编程,即拖即用,妈妈再也不用担心小游戏 SDK 接入了!
    惊天大案!80多款游戏源码被非法倒卖交换!波及数千余人涉案!
    小游戏开发运营挣钱模型之—游戏调优篇(1)
    有个事正在悄然发生,估计谁都无法逆转!只能积极拥抱
  • 原文地址:https://www.cnblogs.com/xing-star/p/10798098.html
Copyright © 2020-2023  润新知