pdlivexp/FaceUnity/src/main/java/com/yunbao/faceunity/widget/TouchStateImageView.java
2022-09-17 16:54:58 +08:00

92 lines
2.8 KiB
Java

package com.yunbao.faceunity.widget;
import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import androidx.annotation.Nullable;
import androidx.appcompat.widget.AppCompatImageView;
/**
* Touch 事件时支持 state 变换
*
* @author Richie on 2018.09.20
*/
public class TouchStateImageView extends AppCompatImageView {
private OnTouchStateListener mOnTouchStateListener;
public TouchStateImageView(Context context) {
super(context);
}
public TouchStateImageView(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
}
public TouchStateImageView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
public void setOnTouchStateListener(OnTouchStateListener onTouchStateListener) {
mOnTouchStateListener = onTouchStateListener;
}
@Override
public void setOnTouchListener(final OnTouchListener l) {
OnTouchListener onTouchListener = new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
setState(event);
boolean ret = l.onTouch(v, event);
if (!ret && mOnTouchStateListener != null) {
return mOnTouchStateListener.onTouch(v, event);
} else {
return ret;
}
}
};
super.setOnTouchListener(onTouchListener);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
setState(event);
if (mOnTouchStateListener != null) {
return mOnTouchStateListener.onTouch(this, event);
} else {
return super.onTouchEvent(event);
}
}
private void setState(MotionEvent event) {
int action = event.getAction();
if (action == MotionEvent.ACTION_DOWN) {
setSelected(true);
} else if (action == MotionEvent.ACTION_UP || action == MotionEvent.ACTION_CANCEL) {
setSelected(false);
}
}
/**
* Interface definition for a callback to be invoked when a touch event is
* dispatched to this view. The callback will be invoked before the touch
* event is given to the view.
*/
public interface OnTouchStateListener {
/**
* Called when a touch event is dispatched to a view. This allows listeners to
* get a chance to respond before the target view.
*
* @param v The view the touch event has been dispatched to.
* @param event The MotionEvent object containing full information about
* the event.
* @return True if the listener has consumed the event, false otherwise.
*/
boolean onTouch(View v, MotionEvent event);
}
}