Android 自定義view仿支付寶咻一咻功能
支付寶上有一個(gè)咻一咻的功能,就是點(diǎn)擊圖片后四周有水波紋的這種效果,今天也寫一個(gè)類似的功能。
效果如下所示:

思路:
就是幾個(gè)圓的半徑不斷在變大,這個(gè)可以使用動(dòng)畫縮放實(shí)現(xiàn),還有透明動(dòng)畫
還有就是這是好幾個(gè)圓,然后執(zhí)行的動(dòng)畫有個(gè)延遲效果,其實(shí)這些動(dòng)畫是放在一起執(zhí)行的,熟悉屬性動(dòng)畫的知道已經(jīng)給我們提供了同步執(zhí)行動(dòng)畫和順序執(zhí)行動(dòng)畫的實(shí)現(xiàn)api,也會(huì)會(huì)有人說(shuō)這幾個(gè)view就是在onDraw()方法中畫幾個(gè)圓,可能會(huì)說(shuō)我還要繼承容器view去onLayout()方法中這些子view添加在某個(gè)特定的區(qū)域,當(dāng)然這也是可以的,其實(shí)簡(jiǎn)單的就是以圖片為中心(圖片imageview在父view的中心),然后畫圓,指定每個(gè)字view的寬和高就行了,具體看代碼:
package com.zhifubaoxiuyixiu.view;
import android.animation.Animator;
import android.animation.AnimatorSet;
import android.animation.ObjectAnimator;
import android.content.Context;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.view.Gravity;
import android.view.View;
import android.view.animation.AccelerateDecelerateInterpolator;
import android.widget.FrameLayout;
import java.util.ArrayList;
/**
* Created by admin on 2016/12/29.
*/
public class ZhifubaoFrameLayout extends FrameLayout {
private int rippleColor = Color.parseColor("#0099CC");//水波紋的顏色
private int radius = 0;//水波紋圓的半徑
private long anim_duration = 3000;//動(dòng)畫執(zhí)行的時(shí)間
private int water_ripple_count = 6;
private int scale = 6;//動(dòng)畫縮放比例
private long animDelay;//動(dòng)畫延遲的時(shí)間
private Paint paint;
private AnimatorSet animatorSet;
private ArrayList<Animator> animatorList;
private FrameLayout.LayoutParams rippleParams;
private ArrayList<WateRipple> rippleViewList=new ArrayList<WateRipple>();
private boolean isAnimRunning = false;
public ZhifubaoFrameLayout(Context context) {
this(context,null);
}
public ZhifubaoFrameLayout(Context context, AttributeSet attrs) {
this(context,attrs,0);
}
public ZhifubaoFrameLayout(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
initPaint();
addChildView();
initAnim();
}
/**
* 初始化動(dòng)畫
*/
private void initAnim() {
animatorSet = new AnimatorSet();
animatorSet.setInterpolator(new AccelerateDecelerateInterpolator());
animatorList=new ArrayList<Animator>();
for(int i=0;i<rippleViewList.size();i++){//幾個(gè)水波紋
final ObjectAnimator scaleXAnimator = ObjectAnimator.ofFloat(rippleViewList.get(i), "ScaleX", 1.0f, scale);
scaleXAnimator.setRepeatCount(ObjectAnimator.INFINITE);
scaleXAnimator.setRepeatMode(ObjectAnimator.RESTART);
scaleXAnimator.setStartDelay(i * animDelay);
scaleXAnimator.setDuration(anim_duration);
animatorList.add(scaleXAnimator);
final ObjectAnimator scaleYAnimator = ObjectAnimator.ofFloat(rippleViewList.get(i), "ScaleY", 1.0f, scale);
scaleYAnimator.setRepeatCount(ObjectAnimator.INFINITE);
scaleYAnimator.setRepeatMode(ObjectAnimator.RESTART);
scaleYAnimator.setStartDelay(i * animDelay);
scaleYAnimator.setDuration(anim_duration);
animatorList.add(scaleYAnimator);
final ObjectAnimator alphaAnimator = ObjectAnimator.ofFloat(rippleViewList.get(i), "Alpha", 1.0f, 0f);
alphaAnimator.setRepeatCount(ObjectAnimator.INFINITE);
alphaAnimator.setRepeatMode(ObjectAnimator.RESTART);
alphaAnimator.setStartDelay(i * animDelay);
alphaAnimator.setDuration(anim_duration);
animatorList.add(alphaAnimator);
}
animatorSet.playTogether(animatorList);
}
/**
* 添加水波紋子view
*/
private void addChildView() {
radius = 32;
animDelay=350;
rippleParams=new FrameLayout.LayoutParams((int)(2*(radius)),(int)(2*(radius)));
rippleParams.gravity = Gravity.CENTER;
for(int i=0;i<water_ripple_count;i++){//幾個(gè)水波紋
WateRipple rippleView=new WateRipple(getContext(),paint);
addView(rippleView,rippleParams);
rippleViewList.add(rippleView);
}
}
/**
* 初始化畫筆
*/
private void initPaint() {
paint = new Paint();
paint.setAntiAlias(true);
paint.setColor(rippleColor);
paint.setStyle(Paint.Style.FILL);
}
/**
* 開(kāi)啟動(dòng)畫
*/
public void startRippleAnimation(){
if(!isRunning()){
for(WateRipple wateRipple:rippleViewList){
wateRipple.setVisibility(VISIBLE);
}
animatorSet.start();
isAnimRunning=true;
}
}
/**
* 動(dòng)畫停止運(yùn)行
*/
public void stopAnimation(){
if(isRunning()){
animatorSet.cancel();
isAnimRunning=false;
}
}
/**
* 判斷是否動(dòng)畫在運(yùn)行
* @return
*/
public boolean isRunning(){
return isAnimRunning;
}
/**
* ui不可見(jiàn)時(shí)關(guān)閉動(dòng)畫
* @param visibility
*/
@Override
protected void onWindowVisibilityChanged(int visibility) {
super.onWindowVisibilityChanged(visibility);
if(visibility==View.INVISIBLE||visibility ==View.GONE){
stopAnimation();
}
}
}
每個(gè)水波紋view
package com.zhifubaoxiuyixiu.view;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.view.View;
/**
* Created by admin on 2016/12/29.
*/
public class WateRipple extends View {
private Paint mPaint;
public WateRipple(Context context, Paint paint){
super(context);
if(paint==null){
this.mPaint = new Paint();
}else{
this.mPaint = paint;
}
setVisibility(View.INVISIBLE);//剛開(kāi)始設(shè)置不可見(jiàn)
}
public WateRipple(Context context) {
super(context);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
int radius=(Math.min(getWidth(),getHeight()))/2;
canvas.drawCircle(radius,radius,radius,mPaint);
}
}
圓形圖片:
package com.zhifubaoxiuyixiu.view;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.BitmapShader;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Shader;
import android.graphics.drawable.ShapeDrawable;
import android.graphics.drawable.shapes.OvalShape;
import android.util.AttributeSet;
import android.view.View;
import com.zhifubaoxiuyixiu.R;
/**
* Created by admin on 2016/12/29.
*/
public class CircleView extends View {
private BitmapShader bitmapShaderp ;
private ShapeDrawable shapeDrawable;
public CircleView(Context context) {
this(context,null);
}
public CircleView(Context context, AttributeSet attrs) {
this(context, attrs,0);
}
public CircleView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
initBitmap();
}
private void initBitmap() {
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.grid);
shapeDrawable = new ShapeDrawable(new OvalShape());
bitmapShaderp = new BitmapShader(bitmap, Shader.TileMode.CLAMP,Shader.TileMode.CLAMP);
shapeDrawable.getPaint().setShader(bitmapShaderp);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
shapeDrawable.setBounds(0,0,getWidth(),getHeight());
shapeDrawable.draw(canvas);
}
}
布局文件:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" > <com.zhifubaoxiuyixiu.view.ZhifubaoFrameLayout android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/root" > <com.zhifubaoxiuyixiu.view.CircleView android:layout_width="64dp" android:layout_height="64dp" android:layout_centerInParent="true" android:id="@+id/imageView" android:layout_gravity="center" android:src="@mipmap/grid"/> </com.zhifubaoxiuyixiu.view.ZhifubaoFrameLayout> </RelativeLayout>
使用:
package com.zhifubaoxiuyixiu;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import com.zhifubaoxiuyixiu.view.CircleView;
import com.zhifubaoxiuyixiu.view.ZhifubaoFrameLayout;
public class MainActivity extends Activity {
private CircleView imageView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
imageView = (CircleView) findViewById(R.id.imageView);
final ZhifubaoFrameLayout root = (ZhifubaoFrameLayout) findViewById(R.id.root);
imageView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
root.startRippleAnimation();
}
});
}
}
以上所述是小編給大家介紹的Android 自定義view仿支付寶咻一咻功能,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
- Android中RecyclerView布局代替GridView實(shí)現(xiàn)類似支付寶的界面
- Android波紋擴(kuò)散效果之仿支付寶咻一咻功能實(shí)現(xiàn)波紋擴(kuò)散特效
- Android app第三方支付寶支付接入教程
- Android支付寶支付封裝代碼
- Android支付寶和微信支付集成
- Android開(kāi)發(fā)之實(shí)現(xiàn)GridView支付寶九宮格
- Android仿支付寶支付從底部彈窗效果
- Android支付寶支付設(shè)計(jì)開(kāi)發(fā)
- 支付寶咻一咻怎么用 Android幫你實(shí)現(xiàn)咻一咻
- Android自定義View實(shí)現(xiàn)支付寶咻一咻效果
相關(guān)文章
13問(wèn)13答全面學(xué)習(xí)Android View繪制
這篇文章主要為大家詳細(xì)介紹了Android View繪制,13問(wèn)13答幫助大家全面學(xué)習(xí)Android View繪制,感興趣的小伙伴們可以參考一下2016-03-03
Kotlin創(chuàng)建一個(gè)好用的協(xié)程作用域
這篇文章主要介紹了Kotlin創(chuàng)建一個(gè)好用的協(xié)程作用域,kotlin中使用協(xié)程,是一定要跟協(xié)程作用域一起配合使用的,否則可能協(xié)程的生命周期無(wú)法被準(zhǔn)確控制,造成內(nèi)存泄漏或其他問(wèn)題2022-07-07
Android動(dòng)態(tài)替換Application實(shí)現(xiàn)
這篇文章主要介紹了Android動(dòng)態(tài)替換Application實(shí)現(xiàn),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-05-05
Android使用Intent實(shí)現(xiàn)頁(yè)面跳轉(zhuǎn)
這篇文章主要為大家詳細(xì)介紹了Android使用Intent實(shí)現(xiàn)頁(yè)面跳轉(zhuǎn),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-10-10
Android開(kāi)發(fā)中button按鈕的使用及動(dòng)態(tài)添加組件方法示例
這篇文章主要介紹了Android開(kāi)發(fā)中button按鈕的使用及動(dòng)態(tài)添加組件方法,涉及Android針對(duì)button按鈕的事件響應(yīng)及TextView動(dòng)態(tài)添加相關(guān)操作技巧,需要的朋友可以參考下2017-11-11

