工作篇 之 高仿微信雙擊消息彈出可自由複製

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,無奈,還好,爲時不晚,一點點的補起~ 加油~!!!

最後,引用大芬兒的一句話,獻給自己,也獻給屏幕面前的你:

熬過了,你就是王者~!

個人公衆號

歡迎關注個人公衆號,不定期發佈博文,感謝老鐵們的關注~

這裏寫圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章