Android仿京东长按商品名称弹出菜单进行复制

长按事件

在Android中提供了长按事件的处理操作,所谓的长按事件就好象读者经常使用某一个手机,长按某一个组件2秒之后才会触发这一操作,而不像普通的单击事件那样,每次单击都会执行一次,长按事件使用View.OnLongClickListener接口进行事件的处理操作,此接口定义如下

public static interface View.OnLongClickListener{  
    public boolean onLongClick(View v) ;  
} 

实现长按商品名称弹出菜单进行复制

效果图
效果图

activity_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:layout_width="match_parent"
              android:layout_height="match_parent"
              android:padding="20dp"
              >

    <TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="【6期免息现货速发】SMARTISAN/锤子 坚果pro全网通4G手机T2 "
        android:textColor="#222222"
        android:textSize="18sp"/>

</LinearLayout>

MainActivity.java

import android.content.ClipData;
import android.content.ClipboardManager;
import android.content.Context;
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.PopupWindow;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

    TextView textView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        textView = (TextView)findViewById(R.id.textView);
        textView.setOnLongClickListener(new View.OnLongClickListener() {
            @Override
            public boolean onLongClick(View view) {
                showPopWindows(view);
                return false;
            }
        });

    }

    private void showPopWindows(View v) {

        /** pop view */
        View mPopView = LayoutInflater.from(this).inflate(R.layout.menu_copy_popup_window, null);
        final PopupWindow mPopWindow = new PopupWindow(mPopView, ViewGroup.LayoutParams.WRAP_CONTENT,
                ViewGroup.LayoutParams.WRAP_CONTENT, true);
        /** set */
        mPopWindow.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
        /** 这个很重要 ,获取弹窗的长宽度 */
        mPopView.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED);
        int popupWidth = mPopView.getMeasuredWidth();
        int popupHeight = mPopView.getMeasuredHeight();
        /** 获取父控件的位置 */
        int[] location = new int[2];
        v.getLocationOnScreen(location);
        /** 显示位置 */
        mPopWindow.showAtLocation(v, Gravity.NO_GRAVITY, (location[0] + v.getWidth() / 2) - popupWidth / 2, location[1]
                +popupHeight/2);
        mPopWindow.update();

        final String copyTxt = (String) v.getTag();
        mPopView.findViewById(R.id.copy).setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                //获取剪贴板管理器:
                ClipboardManager cm = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
                // 创建普通字符型ClipData
                ClipData mClipData = ClipData.newPlainText("Label", textView.getText().toString());
                // 将ClipData内容放到系统剪贴板里。
                cm.setPrimaryClip(mClipData);
                Toast.makeText(MainActivity.this,"已经复制",Toast.LENGTH_SHORT).show();

                if (mPopWindow != null) {
                    mPopWindow.dismiss();
                }
            }
        });
    }
}

menu_copy_popup_window.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              xmlns:tools="http://schemas.android.com/tools"
              android:layout_width="match_parent"
              android:layout_height="match_parent"
              android:gravity="center_horizontal"
              android:orientation="vertical"
    >


    <ImageView
        android:layout_width="18dp"
        android:layout_height="18dp"
        android:background="@drawable/shape_regular_triangle"
        />

    <TextView
        android:id="@+id/copy"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="@drawable/shape_fillet_translucent"
        android:paddingBottom="10dp"
        android:paddingLeft="30dp"
        android:paddingRight="30dp"
        android:paddingTop="10dp"
        android:text="复制"
        android:textColor="@android:color/white"/>

</LinearLayout>

drawable/shape_regular_triangle.xml

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@+id/shape_id">
        <!-- 正三角 -->
        <rotate
            android:fromDegrees="45"
            android:toDegrees="45"
            android:pivotX="-40%"
            android:pivotY="80%">
            <shape android:shape="rectangle">
                <solid android:color="#c800000a"/>

                <corners android:topLeftRadius="2dp"
                    android:topRightRadius="2dp"
                    android:bottomRightRadius="0dp"
                    android:bottomLeftRadius="0dp"/>
            </shape>
        </rotate>
    </item>
</layer-list>

drawable/shape_fillet_translucent.xml

<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <solid android:color="#c800000a" />
    <corners android:topLeftRadius="5dp"
        android:topRightRadius="5dp"
        android:bottomRightRadius="5dp"
        android:bottomLeftRadius="5dp"/>
    <stroke android:width="0dp" android:color="#c800000a" />
</shape>
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值