麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 系統(tǒng) > Android > 正文

Android實(shí)現(xiàn)水波紋擴(kuò)散效果

2019-10-21 21:26:02
字體:
供稿:網(wǎng)友

本文實(shí)例為大家分享了Android實(shí)現(xiàn)水波紋擴(kuò)散效果的具體代碼,供大家參考,具體內(nèi)容如下

先上圖

Android,水波紋,擴(kuò)散

囧!沒有圖片所以就拿了小安代替了。

先看一下如何使用這個(gè)View。

<jianpan.com.mybutton.view.RippleDiffuse android:layout_width="200dp" android:layout_height="200dp" app:btn_img_res="@drawable/rd" app:ripple_img_res="@drawable/rd"></jianpan.com.mybutton.view.RippleDiffuse>

是的,沒有別的代碼了,就這么簡單

實(shí)現(xiàn)思路

自定義ViewGroup,創(chuàng)建一個(gè)用顯示圖片的view,在創(chuàng)建幾個(gè),大小相同的ImageView。當(dāng)按下時(shí),對這幾個(gè)ImageView進(jìn)行放大和漸變。

代碼

首先它肯定是一個(gè)正方形。

@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, widthMeasureSpec); if (!mInitDataSucceed){ initData(); }}

顯示圖片的View的大小,該怎么給?這是個(gè)比較蛋疼的問題。給大了就看不到擴(kuò)散效果了,給小,給多少的值合適呢?有沒有正好的值,有的用父 view 的 size / 子 view 放大的倍數(shù),這樣肯定會達(dá)到理想的效果。

private static final int ANIMATION_EACH_OFFSET = 800; // 每個(gè)動畫的播放時(shí)間間隔private static final int RIPPLE_VIEW_COUNT = 3;//波紋view的個(gè)數(shù)private static final float DEFAULT_SCALE = 1.6f;//波紋放大后的大小//點(diǎn)擊有擴(kuò)散效果的viewprivate CircleImageView mBtnImg;private int mBtnViewHeight;private int mBtnViewWidth;private float mScale = DEFAULT_SCALE;//圖片資源private int mBtnImgRes;private int mRippleRes;//是否初始化完成private boolean mInitDataSucceed = false;private void initData(){ if (getMeasuredHeight() > 0 && getMeasuredWidth() > 0){ mInitDataSucceed = true; int height = getMeasuredHeight() - getPaddingTop() - getPaddingBottom(); int width = getMeasuredWidth() - getPaddingLeft() - getPaddingRight(); mBtnViewHeight = (int) (height / mScale); mBtnViewWidth = (int) (width / mScale); mBtnImg = new CircleImageView(getContext()); mBtnImg.setImageResource(mBtnImgRes); mBtnImg.setOnTouchListener(this); addView(mBtnImg, getWaveLayoutParams()); for (int i = 0; i < RIPPLE_VIEW_COUNT; i++){  //創(chuàng)建view  CircleImageView wave = createWave();  mWaves.add(wave);  //創(chuàng)建動畫  mAnimas.add(getNewAnimationSet());  addView(wave, 0, getWaveLayoutParams()); } }}private CircleImageView createWave(){ CircleImageView CircleImageView = new CircleImageView(getContext()); CircleImageView.setScaleType(ImageView.ScaleType.CENTER_CROP); CircleImageView.setImageResource(mRippleRes); return CircleImageView;}private LayoutParams getWaveLayoutParams(){ LayoutParams lp = new LayoutParams(mBtnViewWidth, mBtnViewHeight); return lp;}private AnimationSet getNewAnimationSet() { AnimationSet as = new AnimationSet(true); ScaleAnimation sa = new ScaleAnimation(1f, mScale, 1f, mScale,  ScaleAnimation.RELATIVE_TO_SELF, 0.5f,  ScaleAnimation.RELATIVE_TO_SELF, 0.5f); sa.setDuration(ANIMATION_EACH_OFFSET * 3); sa.setRepeatCount(-1);// 設(shè)置循環(huán) AlphaAnimation aniAlp = new AlphaAnimation(1, 0.1f); aniAlp.setRepeatCount(-1);// 設(shè)置循環(huán) as.setDuration(ANIMATION_EACH_OFFSET * 3); as.addAnimation(sa); as.addAnimation(aniAlp); return as;}

View 都初始化完成了,好像還差一步,onLayout,只要把子 View 都顯示到中先就可以了。

@Overrideprotected void onLayout(boolean changed, int left, int top, int right, int bottom) { if (mInitDataSucceed) { int childLeft = (getMeasuredWidth() - mBtnViewWidth) / 2; int childTop = (getMeasuredHeight() - mBtnViewHeight) / 2; for (int i = 0; i < RIPPLE_VIEW_COUNT; i++) {  CircleImageView wave = mWaves.get(i);  wave.layout(childLeft, childTop, mBtnViewWidth + childLeft, mBtnViewHeight + childTop); } mBtnImg.layout(childLeft, childTop, mBtnViewWidth + childLeft, mBtnViewHeight + childTop); }else { initData(); }}

最后處理一下圖片的onTouch事件。

@Overridepublic boolean onTouch(View v, MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN:  showWaveAnimation();  break; case MotionEvent.ACTION_MOVE:  break; case MotionEvent.ACTION_UP: case MotionEvent.ACTION_CANCEL:  cancelWaveAnimation();  break; default:  cancelWaveAnimation();  break; } return true;}private void showWaveAnimation() { for (int i = 0; i < RIPPLE_VIEW_COUNT; i++){ Message message = new Message(); message.obj = i; handler.sendMessageDelayed(message, ANIMATION_EACH_OFFSET * i); }}private void cancelWaveAnimation() { for (int i = 0; i < RIPPLE_VIEW_COUNT; i++){ CircleImageView wave = mWaves.get(i); wave.clearAnimation(); }}private Handler handler = new Handler() { @Override public void handleMessage(Message msg) { int position = (int) msg.obj; CircleImageView wave = mWaves.get(position); wave.startAnimation(mAnimas.get(position)); super.handleMessage(msg); }};

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持VEVB武林網(wǎng)。


注:相關(guān)教程知識閱讀請移步到Android開發(fā)頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 久久99国产视频 | 91成人在线网站 | 中文字幕xxx| 中国漂亮护士一级a毛片 | 色播视频在线播放 | 成人午夜精品久久久久久久蜜臀 | 99国产精品欲a | 成人毛片免费播放 | 黄污免费网站 | avlululu | 夜添久久精品亚洲国产精品 | 91九色视频观看 | 欧美成人免费香蕉 | 欧美乱码精品一区 | 特级黄色影院 | 成年性羞羞视频免费观看无限 | 国产91影院 | 毛片免费视频播放 | 欧美黑大粗硬毛片视频 | 成人免费电影在线观看 | 在线影院av | 噜噜噜躁狠狠躁狠狠精品视频 | 日韩视频一区在线 | 国产精品jk白丝蜜臀av软件 | 中文字幕在线观看1 | 亚洲精品午夜在线 | 综合网日日天干夜夜久久 | 国产成人精品一区在线播放 | 久久久久久久九九九九 | 逼片视频 | 黄污网址| 狠狠婷婷综合久久久久久妖精 | 国产乱淫av片免费观看 | 717影院理论午夜伦八戒秦先生 | 成人在线视频免费观看 | 天天操很很操 | 99爱在线免费观看 | 久草在线资源福利站 | 国产一区二区三区四区五区在线 | 欧美黄 片免费观看 | 国产精品久久久久永久免费 |