カスタムImageView長押しで画像を保存
2489 ワード
皆さんはappを開発する時、QRコードを長く押して保存し、画像を長く押して保存するというようなニーズに直面すると信じています.androidは長い押しイベントを提供していますが、製品マネージャーが望んでいる効果とは違い、指を上げるのではなく、2秒で自動的に保存することが一般的です.では、このような小さな変更はどのように実現すればいいのでしょうか.実は難しくありません.imageviewをカスタマイズすることでできます.
くだらないことは言わないで、まず考えを言います:私达は个のViewをカスタマイズしてImageViewから継承することができて、それから事件の配布の方法dispatchTouchEventを书き直して、そして最もいつもtrueに戻って、タッチの事件を遮断して、onTouchの方法の中の长押しする事件も呼び出さないで、私达は更にdispatchTouchEventの中で相応の処理をして、手动的に长押しする事件を呼び出して、MotionEventを避けることができます.ACTION_UPイベントです.コードは簡単です.
注釈のとてもはっきりしていて、みんながすべて理解することができることを信じて、このように完璧に需要を解決して、小さい仲間はもっと簡単な方法で実現することができますか、私信は私に教えます.
くだらないことは言わないで、まず考えを言います:私达は个の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()/論理を保存する}メソッドを設定し、コールバックで対応する論理をすればよいだけです.注釈のとてもはっきりしていて、みんながすべて理解することができることを信じて、このように完璧に需要を解決して、小さい仲間はもっと簡単な方法で実現することができますか、私信は私に教えます.