<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
效果圖
attrs.xml
自定義屬性
<declare-styleable name="RippleAnimationView"> <attr name="ripple_anim_color" format="color" /> <!-- 水波紋填充型別 --> <attr name="ripple_anim_type" format="enum"> <enum name="fillRipple" value="0" /> <enum name="strokeRipple" value="1" /> </attr> <!-- 水波紋的半徑 --> <attr name="radius" format="integer" /> <!-- 水波紋邊框大小 --> <attr name="stroeWidth" format="integer" /> </declare-styleable>
RippleAnimationView.java
管理水波紋屬性以及動畫狀態
public class RippleAnimationView extends RelativeLayout { private Paint paint; private int radius; private int strokeWidth; private int rippleColor; private AnimatorSet animatorSet; public RippleAnimationView(Context context) { this(context, null); } public RippleAnimationView(Context context, @Nullable AttributeSet attrs) { this(context, attrs, 0); } public RippleAnimationView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); init(context, attrs); } private void init(Context context, AttributeSet attrs) { paint = new Paint(); paint.setAntiAlias(true); TypedArray array = context.obtainStyledAttributes(attrs, R.styleable.RippleAnimationView); // 水波紋填充型別 int rippleType = array.getInt(R.styleable.RippleAnimationView_ripple_anim_type, 0); radius = array.getInteger(R.styleable.RippleAnimationView_radius, 54); strokeWidth = array.getInteger(R.styleable.RippleAnimationView_stroeWidth, 2); rippleColor = array.getColor(R.styleable.RippleAnimationView_ripple_anim_color, ContextCompat.getColor(context, R.color.colorAccent)); array.recycle(); // 設定畫筆線寬 paint.setStrokeWidth(UIUtils.getInstance().getWidth(strokeWidth)); if (rippleType == 0) { paint.setStyle(Paint.Style.FILL); } else { paint.setStyle(Paint.Style.STROKE); } paint.setColor(rippleColor); LayoutParams params = new LayoutParams( UIUtils.getInstance().getWidth(radius + strokeWidth), UIUtils.getInstance().getWidth(radius + strokeWidth)); params.addRule(CENTER_IN_PARENT, TRUE); // 縮放係數 float maxScale = UIUtils.getInstance().displayMetricsWidth / (2 * UIUtils.getInstance().getWidth( radius + strokeWidth )); // 延遲時間 int rippleDuration = 3500; int singleDelay = rippleDuration / 4; // 時間間隔 // 動畫集合 List<Animator> animatorList = new ArrayList<>(); // 範例化水波紋view for (int i = 0;i<4;i++){ RippleCircleView rippleCircleView = new RippleCircleView(this); addView(rippleCircleView,params); // 新增水波紋到集合 viewList.add(rippleCircleView); // 初始化屬性動畫 // x ObjectAnimator scaleXAnimator = ObjectAnimator.ofFloat(rippleCircleView,"ScaleX", 1.0f,maxScale); scaleXAnimator.setRepeatCount(ObjectAnimator.INFINITE);// 無限迴圈 scaleXAnimator.setRepeatMode(ObjectAnimator.RESTART); scaleXAnimator.setStartDelay(i*singleDelay); scaleXAnimator.setDuration(rippleDuration); animatorList.add(scaleXAnimator); // y ObjectAnimator scaleYAnimator = ObjectAnimator.ofFloat(rippleCircleView,"ScaleY", 1.0f,maxScale); scaleYAnimator.setRepeatCount(ObjectAnimator.INFINITE);// 無限迴圈 scaleYAnimator.setRepeatMode(ObjectAnimator.RESTART); scaleYAnimator.setStartDelay(i*singleDelay); scaleYAnimator.setDuration(rippleDuration); animatorList.add(scaleYAnimator); // alpha ObjectAnimator alphaAnimator = ObjectAnimator.ofFloat(rippleCircleView,"Alpha", 1.0f,0f); alphaAnimator.setRepeatCount(ObjectAnimator.INFINITE);// 無限迴圈 alphaAnimator.setRepeatMode(ObjectAnimator.RESTART); alphaAnimator.setStartDelay(i*singleDelay); alphaAnimator.setDuration(rippleDuration); animatorList.add(alphaAnimator); } animatorSet = new AnimatorSet(); animatorSet.setInterpolator(new AccelerateDecelerateInterpolator()); // 差值器:先加速,後減速 animatorSet.playTogether(animatorList); } private boolean animationRunning; private List<RippleCircleView> viewList = new ArrayList<>(); /** * 開啟動畫 */ public void startRippleAnimation(){ if (!animationRunning){ for (RippleCircleView rippleCircleView: viewList) { rippleCircleView.setVisibility(VISIBLE); } animatorSet.start(); animationRunning = true; } } /** * 結束動畫 */ public void stopRippleAnimation(){ if (animationRunning){ // 逆序播放(從外向內播放動畫) Collections.reverse(viewList); for (RippleCircleView rippleCircleView: viewList) { rippleCircleView.setVisibility(INVISIBLE); } animatorSet.end(); animationRunning = false; } } public int getStrokeWidth() { return strokeWidth; } public Paint getPaint() { return paint; } public boolean isAnimationRunning() { return animationRunning; } }
RippleCircleView.java
繪製水波紋
public class RippleCircleView extends View { private RippleAnimationView rippleAnimationView; public RippleCircleView(RippleAnimationView rippleAnimationView) { this(rippleAnimationView.getContext(),null); this.rippleAnimationView = rippleAnimationView; // 一開始隱藏 this.setVisibility(INVISIBLE); } public RippleCircleView(Context context, @Nullable AttributeSet attrs) { super(context, attrs); } public RippleCircleView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } @Override protected void onDraw(Canvas canvas) { int radius = Math.min(getWidth(),getHeight()) / 2; // 畫圓 canvas.drawCircle(radius,radius,radius - rippleAnimationView.getStrokeWidth(), rippleAnimationView.getPaint()); } }
使用水波紋動畫
<com.wangyi.course.lession4.RippleAnimationView xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/ripple_view" android:layout_width="match_parent" android:layout_height="match_parent" app:ripple_anim_color="#c0362e" app:stroeWidth="18" app:ripple_anim_type="strokeRipple" app:radius="150"> <ImageView android:id="@+id/iv_play" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:layout_centerVertical="true" android:src="@drawable/ic_play" /> </com.wangyi.course.lession4.RippleAnimationView>
RippleAnimationView rippleAnimationView = findViewById(R.id.ripple_view); findViewById(R.id.iv_play) .setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (rippleAnimationView.isAnimationRunning()) { rippleAnimationView.stopRippleAnimation(); } else { rippleAnimationView.startRippleAnimation(); } } });
到此這篇關於Android實現水波紋效果範例程式碼的文章就介紹到這了,更多相關Android水波紋效果內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45