安卓红包领取详情界面
红包领取界面
·
效果图:




实现代码
布局代码
2、dialog_red_packet.xml
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="310dp"
android:layout_height="430dp"
android:background="@android:color/transparent"
>
<RelativeLayout
android:layout_width="310dp"
android:layout_height="415dp"
android:background="@mipmap/red_packet_bg"
android:paddingLeft="15dp"
android:paddingRight="15dp"
android:paddingTop="15dp"
>
<ImageView
android:id="@+id/iv_close"
android:layout_width="30dp"
android:layout_height="30dp"
android:layout_alignParentRight="true"
android:layout_alignParentTop="true"
android:layout_marginRight="5dp"
android:layout_marginTop="5dp"
android:scaleType="centerInside"
android:src="@mipmap/icon_red_packet_close"
/>
<ImageView
android:id="@+id/iv_avatar"
android:layout_width="60dp"
android:layout_height="60dp"
android:layout_centerHorizontal="true"
android:layout_marginTop="85dp"
/>
<TextView
android:id="@+id/tv_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/iv_avatar"
android:layout_centerHorizontal="true"
android:layout_marginTop="10dp"
android:textColor="#FFE294"
android:textSize="16sp"
/>
<TextView
android:id="@+id/tv_msg"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/tv_name"
android:layout_centerHorizontal="true"
android:layout_marginLeft="15dp"
android:layout_marginRight="15dp"
android:layout_marginTop="15dp"
android:ellipsize="end"
android:singleLine="true"
android:textColor="#FFE294"
android:textSize="18sp"
/>
<ImageView
android:id="@+id/iv_open"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:layout_marginBottom="60dp"
android:background="@mipmap/icon_open_red_packet1"
/>
</RelativeLayout>
</FrameLayout>
3、自定义圆角的dialog
CustomDialog.java
package com.cxcar.hongbao;
import android.app.Dialog;
import android.content.Context;
import android.view.Gravity;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
public class CustomDialog extends Dialog {
private static int default_width = 160;
private static int default_height = 120;
public CustomDialog(Context context, View layout, int style) {
this(context, default_width, default_height, layout, style);
}
public CustomDialog(Context context, int width, int height, View layout, int style) {
super(context, style);
setContentView(layout);
Window window = getWindow();
WindowManager.LayoutParams params = window.getAttributes();
params.gravity = Gravity.CENTER;
window.setAttributes(params);
}
}
4、FrameAnimation.java
package com.cxcar.hongbao;
import android.widget.ImageView;
public class FrameAnimation {
private boolean mIsRepeat;
private AnimationListener mAnimationListener;
private ImageView mImageView;
private int[] mFrameRess;
/**
* 每帧动画的播放间隔数组
*/
private int[] mDurations;
/**
* 每帧动画的播放间隔
*/
private int mDuration;
/**
* 下一遍动画播放的延迟时间
*/
private int mDelay;
private int mLastFrame;
private boolean mNext;
private boolean mPause;
private int mCurrentSelect;
private int mCurrentFrame;
private static final int SELECTED_A = 1;
private static final int SELECTED_B = 2;
private static final int SELECTED_C = 3;
private static final int SELECTED_D = 4;
/**
* @param iv 播放动画的控件
* @param frameRes 播放的图片数组
* @param duration 每帧动画的播放间隔(毫秒)
* @param isRepeat 是否循环播放
*/
public FrameAnimation(ImageView iv, int[] frameRes, int duration, boolean isRepeat) {
this.mImageView = iv;
this.mFrameRess = frameRes;
this.mDuration = duration;
this.mLastFrame = frameRes.length - 1;
this.mIsRepeat = isRepeat;
play(0);
}
/**
* @param iv 播放动画的控件
* @param frameRess 播放的图片数组
* @param durations 每帧动画的播放间隔(毫秒)
* @param isRepeat 是否循环播放
*/
public FrameAnimation(ImageView iv, int[] frameRess, int[] durations, boolean isRepeat) {
this.mImageView = iv;
this.mFrameRess = frameRess;
this.mDurations = durations;
this.mLastFrame = frameRess.length - 1;
this.mIsRepeat = isRepeat;
playByDurations(0);
}
/**
* 循环播放动画
*
* @param iv 播放动画的控件
* @param frameRess 播放的图片数组
* @param duration 每帧动画的播放间隔(毫秒)
* @param delay 循环播放的时间间隔
*/
public FrameAnimation(ImageView iv, int[] frameRess, int duration, int delay) {
this.mImageView = iv;
this.mFrameRess = frameRess;
this.mDuration = duration;
this.mDelay = delay;
this.mLastFrame = frameRess.length - 1;
playAndDelay(0);
}
/**
* 循环播放动画
*
* @param iv 播放动画的控件
* @param frameRess 播放的图片数组
* @param durations 每帧动画的播放间隔(毫秒)
* @param delay 循环播放的时间间隔
*/
public FrameAnimation(ImageView iv, int[] frameRess, int[] durations, int delay) {
this.mImageView = iv;
this.mFrameRess = frameRess;
this.mDurations = durations;
this.mDelay = delay;
this.mLastFrame = frameRess.length - 1;
playByDurationsAndDelay(0);
}
private void playByDurationsAndDelay(final int i) {
mImageView.postDelayed(new Runnable() {
@Override
public void run() {
if (mPause) { // 暂停和播放需求
mCurrentSelect = SELECTED_A;
mCurrentFrame = i;
return;
}
if (0 == i) {
if (mAnimationListener != null) {
mAnimationListener.onAnimationStart();
}
}
mImageView.setBackgroundResource(mFrameRess[i]);
if (i == mLastFrame) {
if (mAnimationListener != null) {
mAnimationListener.onAnimationRepeat();
}
mNext = true;
playByDurationsAndDelay(0);
} else {
playByDurationsAndDelay(i + 1);
}
}
}, mNext && mDelay > 0 ? mDelay : mDurations[i]);
}
private void playAndDelay(final int i) {
mImageView.postDelayed(new Runnable() {
@Override
public void run() {
if (mPause) {
if (mPause) {
mCurrentSelect = SELECTED_B;
mCurrentFrame = i;
return;
}
return;
}
mNext = false;
if (0 == i) {
if (mAnimationListener != null) {
mAnimationListener.onAnimationStart();
}
}
mImageView.setBackgroundResource(mFrameRess[i]);
if (i == mLastFrame) {
if (mAnimationListener != null) {
mAnimationListener.onAnimationRepeat();
}
mNext = true;
playAndDelay(0);
} else {
playAndDelay(i + 1);
}
}
}, mNext && mDelay > 0 ? mDelay : mDuration);
}
private void playByDurations(final int i) {
mImageView.postDelayed(new Runnable() {
@Override
public void run() {
if (mPause) {
if (mPause) {
mCurrentSelect = SELECTED_C;
mCurrentFrame = i;
if (mAnimationListener != null) {
mAnimationListener.onAnimationPause();
}
return;
}
return;
}
if (0 == i) {
if (mAnimationListener != null) {
mAnimationListener.onAnimationStart();
}
}
mImageView.setBackgroundResource(mFrameRess[i]);
if (i == mLastFrame) {
if (mIsRepeat) {
if (mAnimationListener != null) {
mAnimationListener.onAnimationRepeat();
}
playByDurations(0);
} else {
if (mAnimationListener != null) {
mAnimationListener.onAnimationEnd();
}
}
} else {
playByDurations(i + 1);
}
}
}, mDurations[i]);
}
private void play(final int i) {
mImageView.postDelayed(new Runnable() {
@Override
public void run() {
if (mPause) {
if (mPause) {
mCurrentSelect = SELECTED_D;
mCurrentFrame = i;
if (mAnimationListener != null) {
mAnimationListener.onAnimationPause();
}
return;
}
return;
}
if (0 == i) {
if (mAnimationListener != null) {
mAnimationListener.onAnimationStart();
}
}
mImageView.setBackgroundResource(mFrameRess[i]);
if (i == mLastFrame) {
if (mIsRepeat) {
if (mAnimationListener != null) {
mAnimationListener.onAnimationRepeat();
}
play(0);
} else {
if (mAnimationListener != null) {
mAnimationListener.onAnimationEnd();
}
}
} else {
play(i + 1);
}
}
}, mDuration);
}
public static interface AnimationListener {
/**
* <p>Notifies the start of the animation.</p>
*/
void onAnimationStart();
/**
* <p>Notifies the end of the animation. This callback is not invoked
* for animations with repeat count set to INFINITE.</p>
*/
void onAnimationEnd();
/**
* <p>Notifies the repetition of the animation.</p>
*/
void onAnimationRepeat();
void onAnimationPause();
}
/**
* <p>Binds an animation listener to this animation. The animation listener
* is notified of animation events such as the end of the animation or the
* repetition of the animation.</p>
*
* @param listener the animation listener to be notified
*/
public void setAnimationListener(AnimationListener listener) {
this.mAnimationListener = listener;
}
public void release() {
pauseAnimation();
}
public void pauseAnimation() {
this.mPause = true;
}
public boolean isPause() {
return this.mPause;
}
public void restartAnimation() {
if (mPause) {
mPause = false;
switch (mCurrentSelect) {
case SELECTED_A:
playByDurationsAndDelay(mCurrentFrame);
break;
case SELECTED_B:
playAndDelay(mCurrentFrame);
break;
case SELECTED_C:
playByDurations(mCurrentFrame);
break;
case SELECTED_D:
play(mCurrentFrame);
break;
default:
break;
}
}
}
}
5、监听
package com.cxcar.hongbao;
public interface OnRedPacketDialogClickListener {
/**
* 点击了关闭按钮
*/
void onCloseClick();
/**
* 点击了打开红包的按钮
*/
void onOpenClick();
}
6、
package com.cxcar.hongbao;
public class RedPacketEntity{
public String name;
public String avatar;
public String remark;
public RedPacketEntity(String name, String avatar, String remark) {
this.name = name;
this.avatar = avatar;
this.remark = remark;
}
}
7、
红包弹框
*/
package com.cxcar.hongbao;
import android.annotation.SuppressLint;
import android.content.Context;
import android.content.Intent;
import android.os.CountDownTimer;
import android.util.Log;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;
import com.bumptech.glide.Glide;
import com.bumptech.glide.request.RequestOptions;
public class RedPacketViewHolder {
private ImageView mIvAvatar,mIvClose,mIvOpen;
private TextView mTvName,mTvMsg;
private Context mContext;
private OnRedPacketDialogClickListener mListener;
private int[] mImgResIds = new int[]{
R.mipmap.icon_open_red_packet1,
R.mipmap.icon_open_red_packet2,
R.mipmap.icon_open_red_packet3,
R.mipmap.icon_open_red_packet4,
R.mipmap.icon_open_red_packet5,
R.mipmap.icon_open_red_packet6,
R.mipmap.icon_open_red_packet7,
R.mipmap.icon_open_red_packet7,
R.mipmap.icon_open_red_packet8,
R.mipmap.icon_open_red_packet9,
R.mipmap.icon_open_red_packet4,
R.mipmap.icon_open_red_packet10,
R.mipmap.icon_open_red_packet11,
};
private FrameAnimation mFrameAnimation;
public RedPacketViewHolder(Context context, View view) {
mContext = context;
mIvClose=view.findViewById(R.id.iv_close);
mIvAvatar=view.findViewById(R.id.iv_avatar);
mTvName=view.findViewById(R.id.tv_name);
mTvMsg=view.findViewById(R.id.tv_msg);
mIvOpen=view.findViewById(R.id.iv_open);
mIvClose.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
stopAnim();
if (mListener != null) {
mListener.onCloseClick();
}
}
});
mIvOpen.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (mFrameAnimation != null) {
//如果正在转动,则直接返回
return ;
}
startAnim();
if (mListener != null) {
mListener.onOpenClick();
}
new CountDownTimer(5000, 1000) {
public void onTick(long millisUntilFinished) {
Log.d("红包倒计时:", 1+millisUntilFinished / 1000+"");
}
public void onFinish() {
mContext.startActivity(new Intent().setClass(mContext, Main2Activity.class));
stopAnim();
if (mListener != null) {
mListener.onCloseClick();
}
}
}.start();
}
});
}
@SuppressLint("CheckResult")
public void setData(RedPacketEntity entity) {
RequestOptions options = new RequestOptions();
options.centerCrop()
.circleCrop();
Glide.with(mContext)
.load(entity.avatar)
.apply(options)
.into(mIvAvatar);
mTvName.setText(entity.name);
mTvMsg.setText(entity.remark);
}
public void startAnim() {
mFrameAnimation = new FrameAnimation(mIvOpen, mImgResIds, 125, true);
mFrameAnimation.setAnimationListener(new FrameAnimation.AnimationListener() {
@Override
public void onAnimationStart() {
Log.i("", "start");
}
@Override
public void onAnimationEnd() {
Log.i("", "end");
}
@Override
public void onAnimationRepeat() {
Log.i("", "repeat");
}
@Override
public void onAnimationPause() {
mIvOpen.setBackgroundResource(R.mipmap.icon_open_red_packet1);
}
});
}
public void stopAnim() {
if (mFrameAnimation != null) {
mFrameAnimation.release();
mFrameAnimation = null;
}
}
public void setOnRedPacketDialogClickListener(OnRedPacketDialogClickListener listener) {
mListener = listener;
}
}
8、
package com.cxcar.hongbao;
import android.os.Bundle;
import android.view.View;
import androidx.appcompat.app.AppCompatActivity;
public class MainActivity extends AppCompatActivity {
private View mRedPacketDialogView;
private RedPacketViewHolder mRedPacketViewHolder;
private CustomDialog mRedPacketDialog;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void showDialog(View view){
RedPacketEntity entity = new RedPacketEntity("来自二进制的梦", "https://pixy.org/src/125/thumbs350/1251267.jpg", "大吉大利,今晚吃鸡");
showRedPacketDialog(entity);
}
public void showRedPacketDialog(RedPacketEntity entity) {
if (mRedPacketDialogView == null) {
mRedPacketDialogView = View.inflate(this, R.layout.dialog_red_packet, null);
mRedPacketViewHolder = new RedPacketViewHolder(this, mRedPacketDialogView);
mRedPacketDialog = new CustomDialog(this, mRedPacketDialogView, R.style.custom_dialog);
mRedPacketDialog.setCancelable(false);
}
mRedPacketViewHolder.setData(entity);
mRedPacketViewHolder.setOnRedPacketDialogClickListener(new OnRedPacketDialogClickListener() {
@Override
public void onCloseClick() {
mRedPacketDialog.dismiss();
}
@Override
public void onOpenClick() {
//领取红包,调用接口
}
});
mRedPacketDialog.show();
}
}
9、
package com.cxcar.hongbao;
import androidx.appcompat.app.AppCompatActivity;
import android.annotation.SuppressLint;
import android.os.Bundle;
import android.widget.ImageView;
import com.bumptech.glide.Glide;
import de.hdodenhof.circleimageview.CircleImageView;
public class Main2Activity extends AppCompatActivity {
CircleImageView iv_avatar;
@SuppressLint("MissingInflatedId")
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
iv_avatar=findViewById(R.id.iv_avatarr);
Glide.with(this)
.load("https://pixy.org/src/125/thumbs350/1251267.jpg")
.into( iv_avatar);
}
}
项目地址:https://download.csdn.net/download/qq_41733851/87350659?spm=1001.2014.3001.5503
更多推荐



所有评论(0)