カスタムImageView長押しで画像を保存

2489 ワード

皆さんはappを開発する時、QRコードを長く押して保存し、画像を長く押して保存するというようなニーズに直面すると信じています.androidは長い押しイベントを提供していますが、製品マネージャーが望んでいる効果とは違い、指を上げるのではなく、2秒で自動的に保存することが一般的です.では、このような小さな変更はどのように実現すればいいのでしょうか.実は難しくありません.imageviewをカスタマイズすることでできます.
くだらないことは言わないで、まず考えを言います:私达は个のViewをカスタマイズしてImageViewから継承することができて、それから事件の配布の方法dispatchTouchEventを书き直して、そして最もいつもtrueに戻って、タッチの事件を遮断して、onTouchの方法の中の长押しする事件も呼び出さないで、私达は更にdispatchTouchEventの中で相応の処理をして、手动的に长押しする事件を呼び出して、MotionEventを避けることができます.ACTION_UPイベントです.コードは簡単です.
public class MyImageView extends AppCompatImageView {
    private int mLastMotionX, mLastMotionY;
    //     
    private boolean isMoved;
    //     
    private boolean isReleased;
    //   runnable
    private Runnable mLongPressRunnable;
    //     
    private static final int TOUCH_SLOP = 20;

    public MyImageView (Context context) {
        this(context,null);

    }

    public MyImageView (Context context, AttributeSet attrs) {
        super(context, attrs);
		
        mLongPressRunnable = new Runnable() {
            @Override
            public void run() {
                if(isReleased || isMoved) return;
                performLongClick();
            }
        };
    }

    public boolean dispatchTouchEvent(MotionEvent event) {
        int x = (int) event.getX();
        int y = (int) event.getY();
        switch(event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                mLastMotionX = x;
                mLastMotionY = y;

                isReleased = false;
                isMoved = false;
                //     ,           ,            
                postDelayed(mLongPressRunnable,ViewConfiguration.getLongPressTimeout());
                break;
            case MotionEvent.ACTION_MOVE:
                if(isMoved) break;
                if(Math.abs(mLastMotionX-x) > TOUCH_SLOP
                        || Math.abs(mLastMotionY-y) > TOUCH_SLOP) {
                    //      ,      
                    isMoved = true;
                    removeCallbacks(mLongPressRunnable);
                }
                break;
            case MotionEvent.ACTION_UP:
                //   
                isReleased = true;
                removeCallbacks(mLongPressRunnable);
                break;
        }
        return true;
    }
}
最後にsetOnLongClickListener(new View.OnLongClickListener()/論理を保存する}メソッドを設定し、コールバックで対応する論理をすればよいだけです.
注釈のとてもはっきりしていて、みんながすべて理解することができることを信じて、このように完璧に需要を解決して、小さい仲間はもっと簡単な方法で実現することができますか、私信は私に教えます.