觸摸點(diǎn)擊效果基類代碼如下:
/**
* 觸摸點(diǎn)擊基類
*/
public abstract class BaseTouchListener implements View.OnTouchListener{
protected boolean hasPerformedActionUp = false;
@Override
public boolean onTouch(View v, MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN) {
//按鈕點(diǎn)擊時(shí)觸發(fā)點(diǎn)擊效果
actionDown(v);
hasPerformedActionUp = true;
v.getParent().requestDisallowInterceptTouchEvent(true);
}
if (event.getAction() == MotionEvent.ACTION_MOVE && hasPerformedActionUp) {
float offsetX = event.getX();
float offsetY = event.getY();
//觸摸區(qū)域超出view范圍時(shí)取消點(diǎn)擊效果
if ((offsetX < 0 || offsetY < 0 || offsetX > v.getWidth() || offsetY > v.getHeight())) {
actionUp(v);
hasPerformedActionUp = false;
v.getParent().requestDisallowInterceptTouchEvent(false);
}
}
if (event.getAction() == MotionEvent.ACTION_UP && hasPerformedActionUp) {
//按鈕松開時(shí)取消效果
actionUp(v);
}
return false;
}
//取消點(diǎn)擊效果
protected abstract void actionUp(View view);
//點(diǎn)擊效果(比如縮放,高亮,替換背景等等)
protected abstract void actionDown(View view);
}
示例點(diǎn)擊縮放代碼
public class TouchScaleListener extends BaseTouchListener {
private float fromScale = 1.0F;
private float toScale = 0.9F;
public TouchScaleListener() {
}
public TouchScaleListener(float fromScale, float toScale) {
this.fromScale = fromScale;
this.toScale = toScale;
}
public TouchScaleListener(float toScale) {
this.toScale = toScale;
}
@Override
protected void actionDown(View view) {
scaleXY(view, fromScale, toScale);
}
@Override
protected void actionUp(View view) {
scaleXY(view, toScale, fromScale);
}
private void scaleXY(View object, float fromValues, float toValues) {
PropertyValuesHolder pvhX = PropertyValuesHolder.ofFloat("scaleX", fromValues, toValues);
PropertyValuesHolder pvhY = PropertyValuesHolder.ofFloat("scaleY", fromValues, toValues);
ObjectAnimator objectAnim = ObjectAnimator.ofPropertyValuesHolder(object, pvhX, pvhY);
objectAnim.setDuration(25L);
objectAnim.start();
}
}
代碼調(diào)用
//按鈕點(diǎn)擊后縮小
button.setOnTouchListener(new TouchScaleListener(0.90f));