高仿微信双击消息弹出可自由复制

LZ-Says:书山有路勤为径,学海无涯苦作舟。

前言

最近呐,难已琢磨。

很喜欢,却又很忧愁。

喜欢的是,找到了自己认可的、喜欢的工作;

忧愁的是,压力山大。

I Love~!

举个栗子

Enmmm,前几天突然才晓得微信还有一个双击消息弹出且提供自由复制的这么一个小功能,惊呆了,我滴天~!

一起来看看我们微信大大目前的效果:

LZ 最终实现效果:

下面,跟随 LZ 一起来实现这个效果~

炒个栗子

首先,最方便,最省事儿的,当然是调用系统提供的方式,那么在 Android 中,TextView 和 EditText 都为我们提供了这么一个属性,用于支持自由复制:

android:textIsSelectable="true"

使用 EditText 还得处理焦点等等,索性直接采用 TextView,布局 xml 代码如下:

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/et_copy_show"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center_vertical"
    android:background="@color/gray_link_pressed"
    android:drawablePadding="@dimen/dp_15"
    android:hint="This is user copy info."
    android:lineSpacingExtra="@dimen/dp_18"
    android:paddingEnd="@dimen/dp_15"
    android:paddingLeft="@dimen/dp_15"
    android:scrollbars="vertical"
    android:textColor="@color/black"
    android:textIsSelectable="true"
    android:textSize="@dimen/text_size_extra_large" />

而相对 Activity 中处理的代码则较为简单,如下:

/**
 * @author heliquan
 * @date 2018/08/21
 * @desc 高仿微信双击文字消息体放大且提供自由复制
 */
public class CopyTextActivity extends BaseActivity {

    private CopyTextActivity mSelfActivity = CopyTextActivity.this;

    private String mCopyStr;

    private TextView mCopyShowID;

    private float mRawX = 0f, mRawY = 0f;

    private long mDownTime = 0l;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // 设置全屏 调用已封装好的方法
        setFullScreen(mSelfActivity, true);
    }

    @Override
    protected int getContentViewId() {
        return R.layout.activity_copy_text;
    }

    @Override
    protected void initView() {
        mCopyShowID = findViewById(R.id.et_copy_show);
    }

    @Override
    protected void initData() {
        mCopyStr = getIntent().getStringExtra("copyText");
        if (TextUtils.isEmpty(mCopyStr)) {
            return;
        }
        mCopyShowID.setText(mCopyStr);

        initEvent();
    }

    private void initEvent() {
        mCopyShowID.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View view, MotionEvent motionEvent) {
                if (motionEvent.getAction() == MotionEvent.ACTION_DOWN) {
                    mDownTime = System.currentTimeMillis();
                    mRawX = motionEvent.getRawX();
                    mRawY = motionEvent.getRawY();
                }
                if (motionEvent.getAction() == MotionEvent.ACTION_UP) {
                    float endX = motionEvent.getRawX() - mRawX;
                    float endY = motionEvent.getRawY() - mRawY;
                    if (endX < 50.0 && endX > -50.0
                            && endY < 50.0 && endY > -50.0
                            && System.currentTimeMillis() - mDownTime < 500) {
                        finish();
                        return true;
                    }
                }
                return false;
            }
        });
    }

}

效果嘛,则是文章开头那个样子,具体各位老铁根据实际项目需求进行对应修改吧~

让你分分钟实现~!!!

嚼吧嚼吧

这里说说 LZ 之前写的过程中遇到的坑点,一起来看~

1、 TextView 长按事件和单击事件冲突,也不能说是完全冲突,只是轻触滑动时,会调用到之前 LZ 写的 onClick() 方法中,并且执行 finish() 操作,说实话,这点给我恶心坏了。

2、 之后 LZ 采用重写 onTouch() 且根据 Down 事件记录时间戳,在 Up 时获取当前时间差。虽说页实现了这个效果,但是轻触滑动的时候依旧会出现问题一的情况,MMP 了。

3、 原打算使用 ScrollView 嵌套 TextView 或者在 TextView 上再包裹一层,最后想想没必要,一个层级能搞定的事儿,没必要增加无用层级。当然,LZ 也拔开度娘,看了个透透,感觉实现的比较复杂。又不是定制化操作,干嘛做那么多没用的?不懂。

当时也相关基于事件分发进行事件处理,最后想想,好麻烦,懒得搞。

Enmmm,最后还是老贱贱提供方案,只能说不容易。

Enmmm,Android 事件分发,这个点还是比较重要的,最近的工作中遇到好几次了,想躲也躲不掉了。

Enmmm,无奈,还好,为时不晚,一点点的补起~ 加油~!!!

最后,引用大芬儿的一句话,献给自己,也献给屏幕面前的你:

熬过了,你就是王者~!

本文分享自微信公众号 - 贺利权(hlq_struggle)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-08-31

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券