安卓长按后的释放响应(长按模仿iphone6s的3DTouch)

来源:互联网 发布:淘宝客推广教学 编辑:程序博客网 时间:2024/05/05 08:43

安卓长按后的释放响应(长按模仿iphone6s的3DTouch)

我个人觉得iphone的新技术–3dtouch有点多余,我也体验过真机,觉得用长按来取代足够了,看发布会的时候王自如说安卓的长按做不到长按后的释放响应,当时看到我就笑了。。。。。

今天上课无聊,就没事写了个模拟的小程序

一开始想着直接重写onTouchEvent方法判断一下ACTION_UP即可,可是发现并不能,的确是不能响应到ACTION_UP操作,因为父布局将事件拦截了,所以需要重写ViewGroup的onInterceptTouchEvent,为了简单点就直接继承自FrameLayout来做

import android.content.Context;import android.util.AttributeSet;import android.util.Log;import android.view.MotionEvent;import android.widget.FrameLayout;/** * Created by dctrx on 2015/10/10. */public class ThreeDTouchLayout extends FrameLayout{    private static final String TAG = "ThreeDTouchLayout";    private OnActionUpListener onActionUpListener;    public void setOnActionUpListener(OnActionUpListener onActionUpListener) {        this.onActionUpListener = onActionUpListener;    }    public interface OnActionUpListener {        void onActionUp();    }    public ThreeDTouchLayout(Context context) {        super(context);    }    public ThreeDTouchLayout(Context context, AttributeSet attrs) {        super(context, attrs);    }    public ThreeDTouchLayout(Context context, AttributeSet attrs, int defStyleAttr) {        super(context, attrs, defStyleAttr);    }    @Override    public boolean onInterceptTouchEvent(MotionEvent ev) {        if (ev.getAction() == MotionEvent.ACTION_UP) {            Log.d(TAG, "onInterceptTouchEvent->MotionEvent.ACTION_UP");            if (onActionUpListener != null) {                onActionUpListener.onActionUp();                return true;            }        }        return super.onInterceptTouchEvent(ev);    }}

在activity里实现一下接口回掉即可

import android.app.Activity;import android.os.Bundle;import android.view.View;import android.widget.ImageView;import turbo.com.ios3dtouch.ui.ThreeDTouchDialog;import turbo.com.ios3dtouch.ui.ThreeDTouchLayout;public class MainActivity extends Activity {    private static final String TAG = "MainActivity";    ThreeDTouchLayout layout;    ImageView ivImage;    ThreeDTouchDialog threeDTouchDialog;    boolean hasShow;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        layout = (ThreeDTouchLayout) findViewById(R.id.three_d_layout);        layout.setOnActionUpListener(new ThreeDTouchLayout.OnActionUpListener() {            @Override            public void onActionUp() {                if (hasShow) {                    hasShow = false;                    threeDTouchDialog.dismiss();                }            }        });        ivImage = (ImageView) findViewById(R.id.iv_image);        ivImage.setOnLongClickListener(new View.OnLongClickListener() {            @Override            public boolean onLongClick(View v) {                hasShow=true;                threeDTouchDialog = new ThreeDTouchDialog(MainActivity.this);                threeDTouchDialog.show();                return true;            }        });    }}

下面是运行效果:
长按时弹出界面,释放时取消显示

源码地址(AndroidStudio):
http://download.csdn.net/detail/dct8888/9170611

0 0