效果展示
思路
通過監(jiān)聽onTouch
方法
- 在
MotionEvent.ACTION_DOWN
執(zhí)行view變小的動(dòng)畫
v.animate().scaleX(scale).scaleY(scale).setDuration(duration).setInterpolator(interpolator);
- 在
MotionEvent.ACTION_CANCEL
和MotionEvent.ACTION_UP
時(shí)執(zhí)行還原的動(dòng)畫
v.animate().scaleX(1).scaleY(1).setInterpolator(interpolator);
- 同時(shí)需要注意在
onTouch
方法return true;
及處理VIEW的pressed state
核心代碼
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
v.animate().scaleX(scale).scaleY(scale).setDuration(duration).setInterpolator(interpolator);
v.setPressed(true);
break;
case MotionEvent.ACTION_MOVE:
float x = event.getX();
float y = event.getY();
boolean isInside = (x > 0 && x < v.getWidth() && y > 0 && y < v.getHeight());
if (v.isPressed() != isInside) {
v.setPressed(isInside);
}
break;
case MotionEvent.ACTION_CANCEL:
v.setPressed(false);
v.animate().scaleX(1).scaleY(1).setInterpolator(interpolator);
break;
case MotionEvent.ACTION_UP:
v.animate().scaleX(1).scaleY(1).setInterpolator(interpolator);
if (v.isPressed()) {
v.performClick();
v.setPressed(false);
}
break;
}
return true;
}
調(diào)用方法
ImageView iv = (ImageView) findViewById(R.id.iv_test);
TextView tv = (TextView) findViewById(R.id.tv_test);
OnClickAnimTouchListener clickAnim = new OnClickAnimTouchListener();
iv.setOnTouchListener(clickAnim);
tv.setOnTouchListener(clickAnim);
update: 2016.01.15 做了下重構(gòu)碍侦,順便把代碼遷移到我自己的Lib工程,并上傳Jcenter以便以后使用
- 把效果部分抽取成一個(gè)接口
public interface ViewClickEffect {
/** * 按下去的效果 */
void onPressedEffect(View view);
/** * 釋放的效果 * @param view */
void onUnPressedEffect(View view);}
- 這樣我們之前實(shí)現(xiàn)的放大縮小效果就變成了 完整代碼
@Override
public void onPressedEffect(View view) {
view.animate().scaleX(scale).scaleY(scale).setDuration(duration).setInterpolator(interpolator);
}
@Overridepublic void onUnPressedEffect(View view) {
view.animate().scaleX(1).scaleY(1).setInterpolator(interpolator);
}
再順手寫一個(gè)點(diǎn)擊時(shí)改變透明度的 完整代碼
@Override
public void onPressedEffect(View view) {
view.animate().alpha(scale).setDuration(duration).setInterpolator(interpolator);
}
@Override
public void onUnPressedEffect(View view) {
view.animate().alpha(1).setDuration(duration).setInterpolator(interpolator);
}
- 這時(shí)候我們?cè)?code>OnClickEffectTouchListener:)改個(gè)了名捏 里面增加一個(gè)變量,外部可以傳
ViewClickEffect
接口的實(shí)現(xiàn),或者以上兩個(gè)默認(rèn)實(shí)現(xiàn)
private ViewClickEffect mViewClickEffect = new DefaultClickEffectScaleAnimate();
public void setViewClickEffect(ViewClickEffect viewClickEffect) {
mViewClickEffect = viewClickEffect;
}
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
mViewClickEffect.onPressedEffect(v);
v.setPressed(true);
break;
case MotionEvent.ACTION_MOVE:
float x = event.getX();
float y = event.getY();
boolean isInside = (x > 0 && x < v.getWidth() && y > 0 && y < v.getHeight());
if (v.isPressed() != isInside) {
v.setPressed(isInside);
}
break;
case MotionEvent.ACTION_CANCEL:
mViewClickEffect.onUnPressedEffect(v);
v.setPressed(false);
break;
case MotionEvent.ACTION_UP:
mViewClickEffect.onUnPressedEffect(v);
if (v.isPressed()) {
v.performClick();
v.setPressed(false);
}
break;
}
return true;
}
update: 2016.02.19 發(fā)現(xiàn)這邊設(shè)置后會(huì)屏蔽長(zhǎng)按事件睹晒,如果需要響應(yīng)長(zhǎng)按事件的請(qǐng)先不要用此方法呀非,后面有時(shí)間再看如何解決。
是不是很簡(jiǎn)單沒啥技術(shù)含量呢措译,如果噴缨该,請(qǐng)輕噴
完整代碼 GitHub