Android仿硬幣轉(zhuǎn)動(dòng)微信紅包動(dòng)畫效果
項(xiàng)目需要研究了一下微信紅包動(dòng)畫,即硬幣轉(zhuǎn)動(dòng)的效果,原理其實(shí)就是三張不同角度的圖片利用AnimationDrawable幀動(dòng)畫進(jìn)行播放,在參考了案例之后,給自己記錄一下完成的過(guò)程。
1,在XML文件中定義動(dòng)畫:
步驟如下:
①新建 Android 項(xiàng)目
②在drawable目錄中新建一個(gè)anim.xml(注意文件名小寫)
<?xml version="1.0" encoding="utf-8"?> <animation-list xmlns:android="http://schemas.android.com/apk/res/android" android:oneshot="false"> <item android:drawable="@drawable/bag" android:duration="400"></item> <item android:drawable="@drawable/bag1" android:duration="400"></item> <item android:drawable="@drawable/bag2" android:duration="400"></item> </animation-list>
根標(biāo)簽為animation-list,其中oneshot代表著是否只展示一遍,設(shè)置為false會(huì)不停的循環(huán)播放動(dòng)畫根標(biāo)簽下,通過(guò)item標(biāo)簽對(duì)動(dòng)畫中的每一個(gè)圖片進(jìn)行聲明 ,android:duration 表示展示所用的該圖片的時(shí)間長(zhǎng)度 ,可通過(guò)該參數(shù)來(lái)設(shè)置圖片旋轉(zhuǎn)的速度,其他屬性可以自行查找資料~
2,設(shè)置布局文件,效果以及代碼如下

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center_vertical|center_horizontal"
android:background="@drawable/background">
<!-- 關(guān)閉按鈕框 -->
<LinearLayout
android:id="@+id/top"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1">
<Button
android:id="@+id/close"
android:layout_width="32dp"
android:layout_height="32dp"
android:background="@drawable/close"
android:layout_margin="10dp"/>
</LinearLayout>
<!-- 頭像以及相關(guān)文字 -->
<LinearLayout
android:layout_below="@+id/top"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="10"
android:orientation="vertical">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="3">
<ImageButton
android:id="@+id/head_img"
android:layout_width="60dp"
android:layout_height="60dp"
android:background="@drawable/ic_launcher"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"/>
<TextView
android:id="@+id/name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="系統(tǒng)用戶"
android:layout_marginTop="10dp"
android:layout_below="@+id/head_img"
android:layout_centerHorizontal="true"
android:textColor="@color/yellow"
android:textSize="18sp"/>
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/name"
android:layout_centerHorizontal="true"
android:layout_marginTop="5dp"
android:textSize="15sp"
android:textColor="@color/yellow2"
android:text="給你發(fā)了一個(gè)紅包"/>
<TextView
android:id="@+id/textView2"
android:layout_below="@+id/textView1"
android:layout_centerHorizontal="true"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:textColor="@color/yellow"
android:textSize="23sp"
android:text="恭喜發(fā)財(cái),大吉大利"/>
</RelativeLayout>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="3">
<Button
android:id="@+id/open_btn"
android:layout_width="100dp"
android:layout_height="100dp"
android:background="@drawable/anim"
android:layout_marginTop="50dp"
android:layout_centerHorizontal="true" />
</RelativeLayout>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/blow"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:layout_marginBottom="14dp"
android:id="@+id/imageView" />
</RelativeLayout>
</LinearLayout>
</LinearLayout>
3,實(shí)現(xiàn)紅包彈窗的效果,效果及代碼如下:
步驟如下:
①自定義紅包彈窗Diaog類:紅色代碼部分為啟動(dòng)動(dòng)畫部分

package com.example.xuboyu.luckeymoney;
import android.app.Dialog;
import android.content.Context;
import android.content.DialogInterface;
import android.graphics.drawable.AnimationDrawable;
import android.view.Display;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.TextView;
/**
* 自定義紅包彈窗
* Created by xuboyu on 2017/2/20.
*/
public class LuckeyDialog extends Dialog {
public LuckeyDialog(Context context) {
super(context);
}
public LuckeyDialog(Context context, int theme) {
super(context, theme);
}
public static class Builder {
private Context context;
private String name;//發(fā)紅包者的名稱
private Button red_page;
//拆紅包按鈕
private String openButtonText;
private OnClickListener openButtonClickListener;
//關(guān)閉按鈕
private String closeButtonText;
private OnClickListener closeButtonClickListener;
public Builder(Context context, int dialog) {
this.context = context;
}
/**
* Set the Dialog title from resource
*
* @param name
* @return
*/
public Builder setName(int name) {
this.name = (String) context.getText(name);
return this;
}
/**
* Set the Dialog title from String
*
* @param name
* @return
*/
public Builder setName(String name) {
this.name = name;
return this;
}
/**
* Set the positive button resource and it's listener
*
* @param closeButtonText
* @return
*/
public Builder setCloseButton(int closeButtonText,
OnClickListener listener) {
this.closeButtonText = (String) context
.getText(closeButtonText);
this.closeButtonClickListener = listener;
return this;
}
public Builder setCloseButton(String closeButtonText,
OnClickListener listener) {
this.closeButtonText = closeButtonText;
this.closeButtonClickListener = listener;
return this;
}
/**
* Set the positive button resource and it's listener
*
* @param openButtonText
* @return
*/
public Builder setOpenButton(int openButtonText,
OnClickListener listener) {
this.openButtonText = (String) context
.getText(openButtonText);
this.openButtonClickListener = listener;
return this;
}
public Builder setOpenButton(String openButtonText,
OnClickListener listener) {
this.openButtonText = openButtonText;
this.openButtonClickListener = listener;
return this;
}
public LuckeyDialog create() {
LayoutInflater inflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
//加載布局
final LuckeyDialog dialog = new LuckeyDialog(context,R.style.Dialog);
View layout = inflater.inflate(R.layout.open, null);
red_page = (Button) layout.findViewById(R.id.open_btn);
<span style="color:#ff0000;">//red指的是需要播放動(dòng)畫的ImageView控件
AnimationDrawable animationDrawable = (AnimationDrawable)red_page.getBackground();
animationDrawable.start();//啟動(dòng)動(dòng)畫</span>
dialog.addContentView(layout, new ViewGroup.LayoutParams(
ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT));
//設(shè)置發(fā)紅包者姓名
((TextView) layout.findViewById(R.id.name)).setText(name);
//設(shè)置拆紅包的按鈕
if (openButtonText != null) {
((Button) layout.findViewById(R.id.open_btn))
.setText(openButtonText);
if (openButtonClickListener != null) {
((Button) layout.findViewById(R.id.open_btn))
.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
openButtonClickListener.onClick(dialog,
DialogInterface.BUTTON_POSITIVE);
}
});
}
} else {
// if no confirm button just set the visibility to GONE
layout.findViewById(R.id.open_btn).setVisibility(
View.GONE);
}
//設(shè)置關(guān)閉按鈕
if (closeButtonText != null) {
((Button) layout.findViewById(R.id.close))
.setText(closeButtonText);
if (closeButtonClickListener != null) {
((Button) layout.findViewById(R.id.close))
.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
closeButtonClickListener.onClick(dialog,
DialogInterface.BUTTON_POSITIVE);
}
});
}
} else {
// if no confirm button just set the visibility to GONE
layout.findViewById(R.id.close).setVisibility(
View.GONE);
}
dialog.setContentView(layout);
return dialog;
}
}
}
②在系統(tǒng)style文件中新增一個(gè)Diaog
<style name="Dialog" parent="android:style/Theme.Dialog"> <!-- <item name="android:background">#00000000</item> --> <item name="android:windowBackground">@drawable/red_bg</item> <item name="android:windowFrame">@null</item> <item name="android:windowNoTitle">true</item> <item name="android:windowIsFloating">true</item><!-- 是否漂現(xiàn)在activity上 --> <item name="android:windowCloseOnTouchOutside">false</item </style>
③在MainActivity中調(diào)用自定義的Diaog類并實(shí)例化,并且設(shè)置彈出的紅包占屏幕的比例,不然彈出的紅包會(huì)占滿整個(gè)屏幕,紅色代碼為設(shè)置大小代碼。
red1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
LuckeyDialog.Builder builder = new LuckeyDialog.Builder(mContext,R.style.Dialog);//調(diào)用style中的Diaog
builder.setName("系統(tǒng)");
builder.setOpenButton("", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
Intent intent = new Intent(mContext,Open.class);
startActivity(intent);
dialog.dismiss();
}
});
builder.setCloseButton("", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int i) {
dialog.dismiss();
}
});
<span style="color:#ff0000;">Dialog dialog = builder.create();
Window dialogWindow = dialog.getWindow();
WindowManager m = getWindowManager();
Display d = m.getDefaultDisplay(); // 獲取屏幕寬、高用
WindowManager.LayoutParams p = dialogWindow.getAttributes(); // 獲取對(duì)話框當(dāng)前的參數(shù)值
p.height = (int) (d.getHeight() * 0.7); // 高度設(shè)置為屏幕的0.6
p.width = (int) (d.getWidth() * 0.75); // 寬度設(shè)置為屏幕的0.65
dialogWindow.setAttributes(p);
</span>
dialog.show();
}
});
4,完成點(diǎn)擊后的兩種結(jié)果,即搶到和未搶到的兩種結(jié)果,通過(guò)Intent跳轉(zhuǎn)領(lǐng)取成功類或者跳出失敗彈窗的簡(jiǎn)單邏輯即可。
①搶到的效果圖,這里界面比較簡(jiǎn)單就不貼代碼了。

②失敗彈窗的效果圖,這里的自定義彈窗代碼與紅包彈窗的代碼基本相似,區(qū)別就在于少了個(gè)拆紅包按鈕而已,布局也相對(duì)簡(jiǎn)單,就不貼出來(lái)了,主要在這里面需要使用比例來(lái)規(guī)劃幾個(gè)部件的位置(參考上面的紅包代碼),否則無(wú)法適配多種屏幕,會(huì)出現(xiàn)壓縮拉伸變形的情況。

到這里粗略的紅包動(dòng)畫效果就基本完成了!當(dāng)然實(shí)際應(yīng)用中需要用到網(wǎng)絡(luò)請(qǐng)求之類的,就再按照業(yè)務(wù)要求加入。
以上所述是小編給大家介紹的Android仿硬幣轉(zhuǎn)動(dòng)微信紅包動(dòng)畫效果,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
- 通過(guò)FancyView提供 Android 酷炫的開屏動(dòng)畫實(shí)例代碼
- Android自定義帶加載動(dòng)畫效果的環(huán)狀進(jìn)度條
- Android自定義viewGroup實(shí)現(xiàn)點(diǎn)擊動(dòng)畫效果
- Android仿打開微信紅包動(dòng)畫效果實(shí)現(xiàn)代碼
- Android動(dòng)畫入門教程之kotlin
- Android實(shí)現(xiàn)過(guò)渡動(dòng)畫、引導(dǎo)頁(yè) Android判斷是否第一次啟動(dòng)App
- Android 仿余額寶數(shù)字跳動(dòng)動(dòng)畫效果完整代碼
- Android開發(fā)簡(jiǎn)單實(shí)現(xiàn)搖動(dòng)動(dòng)畫的方法
- Android開發(fā)之背景動(dòng)畫簡(jiǎn)單實(shí)現(xiàn)方法
- Android動(dòng)畫實(shí)現(xiàn)原理和代碼
相關(guān)文章
通過(guò)源碼角度看看AccessibilityService
這篇文章主要給大家介紹了關(guān)于通過(guò)源碼角度看看AccessibilityService的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2018-06-06
Android如何創(chuàng)建自定義ActionBar
這篇文章主要教大家如何創(chuàng)建自定義的ActionBar,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-11-11
Android編程之TabWidget選項(xiàng)卡用法實(shí)例分析
這篇文章主要介紹了Android編程之TabWidget選項(xiàng)卡用法,結(jié)合實(shí)例形式較為詳細(xì)的分析了TabWidget選項(xiàng)卡的具體實(shí)現(xiàn)技巧與使用注意事項(xiàng),需要的朋友可以參考下2015-12-12
Android WebView與JS交互全面詳解(小結(jié))
本篇文章主要介紹了Android WebView與JS交互全面詳解(小結(jié)),實(shí)現(xiàn)了Android客戶端與Web網(wǎng)頁(yè)交互,具有一定的參考價(jià)值,有興趣的可以了解一下2017-11-11
Android利用ConstraintLayout實(shí)現(xiàn)漂亮的動(dòng)畫詳解
最近在無(wú)意中看到一篇關(guān)于ConstraintLayout的文章,ConstraintLayout是Android Studio 2.2中主要的新增功能之一,下面這篇文章主要給大家介紹了關(guān)于Android利用ConstraintLayout實(shí)現(xiàn)漂亮的動(dòng)畫的相關(guān)資料,需要的朋友可以參考下。2017-05-05
Android 中 TabHost與ViewPager結(jié)合實(shí)現(xiàn)首頁(yè)導(dǎo)航效果
這篇文章主要介紹了Android 中 TabHost與ViewPager結(jié)合實(shí)現(xiàn)首頁(yè)導(dǎo)航效果,代碼簡(jiǎn)單易懂,感興趣的朋友參考下吧2016-09-09
Android eclipse使用gradle打包的圖文教程
本文通過(guò)圖文并茂的形式給大家介紹了Android eclipse使用gradle打包的方法,需要的朋友可以參考下2018-10-10

