安卓通過設(shè)置View的OnTouchListener超簡(jiǎn)單實(shí)現(xiàn)點(diǎn)擊動(dòng)畫效果

效果展示

思路

通過監(jiān)聽onTouch方法

  • MotionEvent.ACTION_DOWN執(zhí)行view變小的動(dòng)畫
    v.animate().scaleX(scale).scaleY(scale).setDuration(duration).setInterpolator(interpolator);
  • MotionEvent.ACTION_CANCELMotionEvent.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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末偎行,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌睦优,老刑警劉巖,帶你破解...
    沈念sama閱讀 223,002評(píng)論 6 519
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件壮不,死亡現(xiàn)場(chǎng)離奇詭異汗盘,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)询一,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,357評(píng)論 3 400
  • 文/潘曉璐 我一進(jìn)店門隐孽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人健蕊,你說我怎么就攤上這事菱阵。” “怎么了缩功?”我有些...
    開封第一講書人閱讀 169,787評(píng)論 0 365
  • 文/不壞的土叔 我叫張陵晴及,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我嫡锌,道長(zhǎng)虑稼,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,237評(píng)論 1 300
  • 正文 為了忘掉前任势木,我火速辦了婚禮蛛倦,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘啦桌。我一直安慰自己溯壶,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,237評(píng)論 6 398
  • 文/花漫 我一把揭開白布甫男。 她就那樣靜靜地躺著且改,像睡著了一般。 火紅的嫁衣襯著肌膚如雪查剖。 梳的紋絲不亂的頭發(fā)上钾虐,一...
    開封第一講書人閱讀 52,821評(píng)論 1 314
  • 那天,我揣著相機(jī)與錄音笋庄,去河邊找鬼效扫。 笑死,一個(gè)胖子當(dāng)著我的面吹牛直砂,可吹牛的內(nèi)容都是我干的菌仁。 我是一名探鬼主播,決...
    沈念sama閱讀 41,236評(píng)論 3 424
  • 文/蒼蘭香墨 我猛地睜開眼静暂,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼济丘!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,196評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤摹迷,失蹤者是張志新(化名)和其女友劉穎疟赊,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體峡碉,經(jīng)...
    沈念sama閱讀 46,716評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡近哟,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,794評(píng)論 3 343
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了鲫寄。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片吉执。...
    茶點(diǎn)故事閱讀 40,928評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖地来,靈堂內(nèi)的尸體忽然破棺而出戳玫,到底是詐尸還是另有隱情,我是刑警寧澤未斑,帶...
    沈念sama閱讀 36,583評(píng)論 5 351
  • 正文 年R本政府宣布咕宿,位于F島的核電站,受9級(jí)特大地震影響蜡秽,放射性物質(zhì)發(fā)生泄漏荠列。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,264評(píng)論 3 336
  • 文/蒙蒙 一载城、第九天 我趴在偏房一處隱蔽的房頂上張望肌似。 院中可真熱鬧,春花似錦诉瓦、人聲如沸川队。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,755評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)固额。三九已至,卻和暖如春煞聪,著一層夾襖步出監(jiān)牢的瞬間斗躏,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,869評(píng)論 1 274
  • 我被黑心中介騙來泰國(guó)打工昔脯, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留啄糙,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,378評(píng)論 3 379
  • 正文 我出身青樓云稚,卻偏偏與公主長(zhǎng)得像隧饼,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子静陈,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,937評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容

  • 原文地址:http://www.android100.org/html/201606/06/241682.html...
    AFinalStone閱讀 947評(píng)論 0 1
  • 生化本來就不容易啊燕雁,而我們的不努力只會(huì)讓生活變得更加無賴 這一個(gè)月發(fā)生的事有點(diǎn)多诞丽,有那么一段時(shí)間在緩沖。然后課程也...
    AmatorLee閱讀 870評(píng)論 2 10
  • Android中動(dòng)畫分為三種: 逐幀動(dòng)畫 補(bǔ)間動(dòng)畫 屬性動(dòng)畫 逐幀動(dòng)畫 逐幀動(dòng)畫類似于gif或是電影的原理拐格,通過將...
    fengmlo閱讀 718評(píng)論 0 2
  • 3.0以前僧免,android支持兩種動(dòng)畫模式,tween animation,frame animation捏浊,在an...
    Ten_Minutes閱讀 1,656評(píng)論 0 4
  • 道法符咒何不靈 行住坐臥心不靜 晨鐘暮鼓細(xì)細(xì)聽 人生處處是修行
    緣渡閱讀 191評(píng)論 0 2