亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > Android > 正文

Android 5.0 實現水波擴散效果

2019-10-21 21:26:01
字體:
來源:轉載
供稿:網友

本文實例為大家分享了Android 5.0 實現水波擴散效果的具體代碼,供大家參考,具體內容如下

該效果是通過自定義界面來實現的

1、首先自定義屬性,attrs.xml代碼如下:

<?xml version="1.0" encoding="utf-8"?><resources>   <declare-styleable name="RippleView">    <attr name="rippleColor" format="color" />    <attr name="rippleAlpha" format="float" />    <attr name="maskAlpha" format="float" />    <attr name="rippleTime" format="integer" />  </declare-styleable> </resources>

其中屬性rippleColor為水波動畫的顏色,rippleAlpha為其透明度,rippleTime為動畫持續時間,maskAlpha為觸摸遮掩層的透明度。

2、自定義RippleView類繼承RelativeLayout布局,也可以由需求所定繼承于其它類,實現水波擴散效果主要的有兩點:水波擴散的繪制和動畫

1)水波的繪制其實就是繪制一個圓形

canvas.drawCircle(mDownX, mDownY, mRadius, mRipplePaint);

2)動畫效果就是該圓形的繪制從小到大的過程,而該圓形到最大時的半徑長度就是當前所在布局的對角線長度:

@Overrideprotected void onSizeChanged(int w, int h, int oldw, int oldh) { super.onSizeChanged(w, h, oldw, oldh); // 獲取最大半徑 mMaxRadius = (float) Math.sqrt(w * w + h * h);}

動畫效果用屬性動畫ObjectAnimator來實現(ObjectAnimator是android3.0后出現的)如下

mRippleAnim = ObjectAnimator.ofFloat(this, "radius", 0, mMaxRadius);mRippleAnim.setInterpolator(new AccelerateDecelerateInterpolator());mRippleAnim.setDuration(mRippleTime);

其中的radius為自定義的屬性,在動畫執行時會回調對應的方法,只需要在該方法中更新圓形的半徑就行了

public void setRadius(final float radius) { mRadius = radius; invalidate();}

RippleView完整代碼如下:

public class RippleView extends RelativeLayout {  private int mRippleColor;// 水波顏色  private float mMaskAlpha;// 遮掩透明度 private float mRippleAlpha;// 水波透明度  private int mRippleTime;// 水波動畫時間 private ObjectAnimator mRippleAnim;// 顯示水波動畫  private float mRadius;// 當前的半徑 private float mMaxRadius;// 水波最大半徑  private float mDownX; // 記錄手指按下的位置 private float mDownY; private boolean mIsMask; private boolean mIsAnimating;// 是否正在播放動畫  private RectF mRect; private Path mPath; private Paint mMaskPaint; private Paint mRipplePaint;  public RippleView(Context context) { this(context, null); }  public RippleView(Context context, AttributeSet attrs) { this(context, attrs, 0); }  public RippleView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); init(); // 獲取自定義屬性 TypedArray ta = context.obtainStyledAttributes(attrs,  R.styleable.RippleView); mRippleColor = ta.getColor(R.styleable.RippleView_rippleColor,  mRippleColor); mMaskAlpha = ta.getFloat(R.styleable.RippleView_maskAlpha, mMaskAlpha); mRippleAlpha = ta.getFloat(R.styleable.RippleView_rippleAlpha,  mRippleAlpha); mRippleTime = ta.getInt(R.styleable.RippleView_rippleTime, mRippleTime); ta.recycle(); initLast(); }  // 初始化方法 private void init() { mRippleColor = Color.BLACK; mMaskAlpha = 0.4f; mRippleAlpha = 0.8f; mRippleTime = 800;  mPath = new Path(); mMaskPaint = new Paint(Paint.ANTI_ALIAS_FLAG); mRipplePaint = new Paint(Paint.ANTI_ALIAS_FLAG); }  // 初始化 private void initLast() { mMaskPaint.setColor(mRippleColor); mRipplePaint.setColor(mRippleColor); mMaskPaint.setAlpha((int) (mMaskAlpha * 255)); mRipplePaint.setAlpha((int) (mRippleAlpha * 255)); }  // 初始化動畫 private void initAnim() { mRippleAnim = ObjectAnimator.ofFloat(this, "radius", 0, mMaxRadius); mRippleAnim.setInterpolator(new AccelerateDecelerateInterpolator()); mRippleAnim.setDuration(mRippleTime); mRippleAnim.addListener(new Animator.AnimatorListener() {  @Override  public void onAnimationStart(Animator animator) {  mIsAnimating = true;  }   @Override  public void onAnimationEnd(Animator animator) {  setRadius(0);  mIsMask = false;  mIsAnimating = false;  }   @Override  public void onAnimationCancel(Animator animator) {   }   @Override  public void onAnimationRepeat(Animator animator) {   } }); }  @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { super.onSizeChanged(w, h, oldw, oldh); // 獲取最大半徑 mMaxRadius = (float) Math.sqrt(w * w + h * h); // 獲取該類布局范圍 mRect = new RectF(0f, 0f, getMeasuredWidth() * 1.0f,  getMeasuredHeight() * 1.0f); // 初始化動畫 initAnim(); }  @Override public boolean onTouchEvent(MotionEvent event) { // 按下事件 if (event.getAction() == MotionEvent.ACTION_DOWN) {  mIsMask = true;  invalidate(); } else if (event.getAction() == MotionEvent.ACTION_MOVE) {  invalidate(); } // 抬起事件 else if (event.getAction() == MotionEvent.ACTION_UP) {  mDownX = event.getX();  mDownY = event.getY();  if (mIsAnimating) {  mRippleAnim.cancel();  }  boolean isInView = mRect.contains(mDownX, mDownY);  if (isInView) {  mRippleAnim.start();  } else {  mIsMask = false;  invalidate();  }  }  return true; }  @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); // 繪制遮掩 if (mIsMask) {  canvas.save(Canvas.CLIP_SAVE_FLAG);  mPath.reset();  mPath.addRect(mRect, Path.Direction.CW);  canvas.clipPath(mPath);  canvas.drawRect(mRect, mMaskPaint);  canvas.restore();  }  // 繪制水波 canvas.save(Canvas.CLIP_SAVE_FLAG); mPath.reset(); mPath.addCircle(mDownX, mDownY, mRadius, Path.Direction.CW); canvas.clipPath(mPath); canvas.drawCircle(mDownX, mDownY, mRadius, mRipplePaint); canvas.restore();  }  // 屬性動畫回調的方法 public void setRadius(final float radius) { mRadius = radius; invalidate(); }}

界面布局代碼

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  xmlns:tools="http://schemas.android.com/tools"  xmlns:ripple="http://schemas.android.com/apk/res/com.example.rippleview"  android:layout_width="match_parent"  android:layout_height="match_parent"  android:background="#000000" >   <com.example.rippleview.RippleView    android:layout_width="match_parent"    android:layout_height="100dp"    android:layout_centerInParent="true"    android:background="#ffffff"    android:clickable="true"    ripple:rippleColor="#ababab" >     <TextView      android:layout_width="wrap_content"      android:layout_height="wrap_content"      android:layout_centerInParent="true"      android:text="click me"      android:textSize="18sp" />  </com.example.rippleview.RippleView> </RelativeLayout>

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網。


注:相關教程知識閱讀請移步到Android開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲精品白浆高清久久久久久| 欧美激情三级免费| 精品无人区乱码1区2区3区在线| 久久免费高清视频| 久久天天躁狠狠躁夜夜av| 欧美老少配视频| 精品国产欧美一区二区五十路| 日韩av综合网站| 国产欧美精品日韩| 久久久久亚洲精品成人网小说| 精品国产一区二区三区在线观看| 欧美噜噜久久久xxx| 久久亚洲影音av资源网| 日韩一区二区av| 午夜精品久久久久久久白皮肤| 69久久夜色精品国产69| 88国产精品欧美一区二区三区| 成人亚洲综合色就1024| 亚洲第一色在线| 日韩有码视频在线| 国产精品免费久久久久久| 久久久久久久久国产精品| 亚洲人成在线观看网站高清| 欧美限制级电影在线观看| 精品久久久久久久久久久久久久| 美女少妇精品视频| 久久电影一区二区| 欧美激情小视频| 欧美一级电影免费在线观看| 亚洲自拍偷拍色图| 亚洲美女av黄| 欧美有码在线观看视频| 欧美成人在线影院| 欧美在线视频在线播放完整版免费观看| 日韩第一页在线| 国产精品h片在线播放| 久久久爽爽爽美女图片| 国产成人久久久| 色噜噜狠狠狠综合曰曰曰| 欧美在线亚洲一区| 精品久久久久久久久久久久久| 一区二区在线免费视频| 日韩欧美a级成人黄色| 欧美日韩在线观看视频| 欧美日本国产在线| 91av在线国产| 欧美大胆在线视频| 欧美激情免费观看| 久久综合久中文字幕青草| 亚洲网站在线观看| 国产一区二区三区在线观看网站| 久久久久久久久91| 日韩毛片中文字幕| 法国裸体一区二区| 国产不卡一区二区在线播放| 欧美激情视频播放| 成人av.网址在线网站| 欧美精品久久一区二区| 亚洲理论片在线观看| 国产一区二区av| 欧美日韩国产中文精品字幕自在自线| 日韩av一区二区在线观看| 国产婷婷成人久久av免费高清| 成人xvideos免费视频| 欧洲成人午夜免费大片| 精品国产一区二区三区久久狼黑人| 欧美午夜宅男影院在线观看| 欧美激情精品久久久久久变态| 色小说视频一区| 97精品视频在线| 欧美麻豆久久久久久中文| 92国产精品视频| 精品香蕉一区二区三区| 中文字幕亚洲一区在线观看| 久久久久久久999精品视频| 亚洲欧美国产一区二区三区| 亚洲网站在线观看| 一道本无吗dⅴd在线播放一区| 国产精品99久久久久久人| 视频一区视频二区国产精品| 久久91亚洲精品中文字幕奶水| 日韩精品中文字幕视频在线| 亚洲人a成www在线影院| 久久久噜噜噜久久久| 日韩久久午夜影院| 亚洲精品www久久久| 88xx成人精品| 亚洲一区二区三区777| 一区二区亚洲欧洲国产日韩| 一本色道久久综合亚洲精品小说| 在线观看亚洲视频| 91精品国产高清自在线| 91精品久久久久久久久久久久久久| 欧洲精品久久久| 69视频在线免费观看| 日韩电影在线观看中文字幕| 亚洲成人网久久久| 精品在线欧美视频| 欧美日韩ab片| 成人激情视频在线观看| 亚洲第一偷拍网| 国产亚洲欧美日韩一区二区| 国产精品海角社区在线观看| 91麻豆国产语对白在线观看| 国产国语videosex另类| 欧美大片大片在线播放| 国产成人精品综合久久久| 亚洲japanese制服美女| 日韩有码视频在线| 26uuu另类亚洲欧美日本老年| 久久久久久久影院| 久久视频在线播放| 久久精品久久精品亚洲人| 国产午夜精品全部视频在线播放| 日韩大陆毛片av| 日韩美女免费线视频| 日韩免费av片在线观看| 97不卡在线视频| 亚洲精品免费在线视频| 国产97在线观看| 97精品国产97久久久久久春色| 国产精品h片在线播放| 国产精品网红直播| 国产精品一区二区三区久久| 国产99久久精品一区二区 夜夜躁日日躁| 欧美日韩美女在线| 国产91亚洲精品| 成人黄色短视频在线观看| 久久精品2019中文字幕| 中文字幕日韩专区| 国产精品亚洲精品| 国产精品欧美久久久| 尤物yw午夜国产精品视频明星| 亚洲二区在线播放视频| 亚洲综合最新在线| 永久免费毛片在线播放不卡| 欧美大片第1页| 久久中文久久字幕| 91九色视频导航| 亚洲免费小视频| 日韩毛片在线观看| 在线中文字幕日韩| 日韩成人在线免费观看| 亚洲free性xxxx护士hd| 国产精品亚洲一区二区三区| 91免费观看网站| 国产精品美女在线| 久久成人av网站| 影音先锋欧美在线资源| 亚洲国产精品va| 性欧美亚洲xxxx乳在线观看| 欧美性猛交xxxx富婆| 午夜精品久久久久久99热| 在线观看精品自拍私拍| 日韩有码在线播放| 欧美在线视频一二三| www.xxxx欧美| 91中文字幕一区| 亚洲精品国精品久久99热一| 日韩免费在线视频| 亚洲欧美日韩中文在线制服| 亚洲欧美第一页| 性色av香蕉一区二区| 国产精品嫩草影院一区二区|