diff --git a/moduleUtil/src/main/java/com/xscm/moduleutil/view/QXMeetGiftView.java b/moduleUtil/src/main/java/com/xscm/moduleutil/view/QXMeetGiftView.java index 7bdf70c..7e370fa 100644 --- a/moduleUtil/src/main/java/com/xscm/moduleutil/view/QXMeetGiftView.java +++ b/moduleUtil/src/main/java/com/xscm/moduleutil/view/QXMeetGiftView.java @@ -1,269 +1,269 @@ -//package com.xscm.moduleutil.view; -// -//import android.content.Context; -// -// -// -//import android.content.res.TypedArray; -//import android.graphics.drawable.Drawable; -//import android.util.AttributeSet; -//import android.util.TypedValue; -//import android.view.Gravity; -//import android.view.View; -//import android.view.animation.Animation; -//import android.view.animation.RotateAnimation; -//import android.widget.Button; -//import android.widget.ImageView; -//import android.widget.RelativeLayout; -//import android.widget.TextView; -// -//import androidx.annotation.Nullable; -// -//import com.xscm.moduleutil.R; -// -// -//public class QXMeetGiftView extends RelativeLayout { -// -// private TextView giftNameLabel; -// private ImageView giftPriceBgView; -// private Button giftCoin; -// private ImageView bgImageView; -// private ImageView giftBgImageView; -// private ImageView giftImageView; -// -// // 自定义属性变量 -// private int normalBgRes; -// private int lockBgRes; -// private int giftLightBgRes; -// private int priceBgRes; -// private int coinIconRes; -// private int giftNameColor; -// private int coinTextColor; -// private float giftNameSize; -// private float coinTextSize; -// private int bgBottomMargin; -// private int giftImageMargin; -// private int priceBgHeight; -// private int priceBgBottomMargin; -// private int lockGiftSize; -// private int rotateDuration; -// -// private boolean isLockGift; -// private Object model; -// -// public QXMeetGiftView(Context context) { -// this(context, null); -// } -// -// public QXMeetGiftView(Context context, @Nullable AttributeSet attrs) { -// this(context, attrs, 0); -// } -// -// public QXMeetGiftView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { -// super(context, attrs, defStyleAttr); -// // 解析自定义属性 -// initAttrs(context, attrs); -// // 初始化子视图 -// initSubviews(context); -// } -// -// /** -// * 解析自定义属性,设置默认值 -// */ -// private void initAttrs(Context context, AttributeSet attrs) { -// TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.QXMeetGiftView); -// -// // 背景资源(默认使用原代码中的资源) -// normalBgRes = ta.getResourceId(R.styleable.QXMeetGiftView_normalBg, R.drawable.ac_left_gift_bg); -// lockBgRes = ta.getResourceId(R.styleable.QXMeetGiftView_lockBg, R.drawable.ac_lock_gift_bg); -// giftLightBgRes = ta.getResourceId(R.styleable.QXMeetGiftView_giftLightBg, R.drawable.ac_lock_gift_light_bg); -// priceBgRes = ta.getResourceId(R.styleable.QXMeetGiftView_priceBg, R.drawable.ac_meet_gift_name_bg); -// coinIconRes = ta.getResourceId(R.styleable.QXMeetGiftView_coinIcon, R.drawable.sky_item_coin); -// -// // 文字样式 -// giftNameColor = ta.getColor(R.styleable.QXMeetGiftView_giftNameColor, 0xFFFFFFFF); -// coinTextColor = ta.getColor(R.styleable.QXMeetGiftView_coinTextColor, 0xFFC7BF62); -// giftNameSize = ta.getDimension(R.styleable.QXMeetGiftView_giftNameSize, sp2px(12)); -// coinTextSize = ta.getDimension(R.styleable.QXMeetGiftView_coinTextSize, sp2px(10)); -// -// // 尺寸配置 -// bgBottomMargin = ta.getDimensionPixelOffset(R.styleable.QXMeetGiftView_bgBottomMargin, dp2px(19)); -// giftImageMargin = ta.getDimensionPixelOffset(R.styleable.QXMeetGiftView_giftImageMargin, dp2px(6)); -// priceBgHeight = ta.getDimensionPixelOffset(R.styleable.QXMeetGiftView_priceBgHeight, dp2px(15)); -// priceBgBottomMargin = ta.getDimensionPixelOffset(R.styleable.QXMeetGiftView_priceBgBottomMargin, dp2px(15)); -// lockGiftSize = ta.getDimensionPixelOffset(R.styleable.QXMeetGiftView_lockGiftSize, dp2px(62)); -// -// // 动画时长 -// rotateDuration = ta.getInt(R.styleable.QXMeetGiftView_rotateDuration, 3000); -// -// ta.recycle(); // 回收资源,避免内存泄漏 -// } -// -// private void initSubviews(Context context) { -// // 1. 主背景 -// bgImageView = new ImageView(context); -// bgImageView.setScaleType(ImageView.ScaleType.FIT_XY); -// bgImageView.setImageResource(normalBgRes); // 使用自定义属性 -// LayoutParams bgParams = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT); -// bgParams.addRule(ALIGN_PARENT_TOP); -// bgParams.addRule(ALIGN_PARENT_LEFT); -// bgParams.addRule(ALIGN_PARENT_RIGHT); -// bgParams.bottomMargin = bgBottomMargin; // 使用自定义属性 -// addView(bgImageView, bgParams); -// -// // 2. 礼物光效背景 -// giftBgImageView = new ImageView(context); -// giftBgImageView.setScaleType(ImageView.ScaleType.FIT_XY); -// giftBgImageView.setImageResource(giftLightBgRes); // 使用自定义属性 -// giftBgImageView.setVisibility(View.GONE); -// LayoutParams giftBgParams = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT); -// giftBgParams.addRule(ALIGN_PARENT_TOP); -// giftBgParams.addRule(ALIGN_PARENT_LEFT); -// giftBgParams.addRule(ALIGN_PARENT_RIGHT); -// giftBgParams.bottomMargin = bgBottomMargin; // 使用自定义属性 -// addView(giftBgImageView, giftBgParams); -// -// // 3. 礼物图片 -// giftImageView = new ImageView(context); -// giftImageView.setScaleType(ImageView.ScaleType.FIT_CENTER); -// LayoutParams giftImageParams = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT); -// giftImageParams.addRule(CENTER_IN_PARENT); -// giftImageParams.setMargins(giftImageMargin, giftImageMargin, giftImageMargin, 0); // 使用自定义属性 -// addView(giftImageView, giftImageParams); -// -// // 4. 价格背景 -// giftPriceBgView = new ImageView(context); -// giftPriceBgView.setImageResource(priceBgRes); // 使用自定义属性 -// LayoutParams priceBgParams = new LayoutParams(LayoutParams.MATCH_PARENT, priceBgHeight); // 使用自定义属性 -// priceBgParams.addRule(ALIGN_PARENT_BOTTOM); -// priceBgParams.bottomMargin = priceBgBottomMargin; // 使用自定义属性 -// addView(giftPriceBgView, priceBgParams); -// -// // 5. 金币按钮 -// giftCoin = new Button(context); -// giftCoin.setTextColor(coinTextColor); // 使用自定义属性 -// giftCoin.setTextSize(TypedValue.COMPLEX_UNIT_PX, coinTextSize); // 使用自定义属性 -// // 金币图标 -// Drawable coinDrawable = getResources().getDrawable(coinIconRes); // 使用自定义属性 -// coinDrawable.setBounds(0, 0, dp2px(12), dp2px(12)); -// giftCoin.setCompoundDrawables(coinDrawable, null, null, null); -// giftCoin.setBackgroundColor(0x00000000); // 透明背景 -// LayoutParams coinParams = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); -// coinParams.addRule(CENTER_IN_PARENT, TRUE); -// addView(giftCoin, coinParams); -// -// // 6. 礼物名称 -// giftNameLabel = new TextView(context); -// giftNameLabel.setTextColor(giftNameColor); // 使用自定义属性 -// giftNameLabel.setTextSize(TypedValue.COMPLEX_UNIT_PX, giftNameSize); // 使用自定义属性 -// giftNameLabel.setGravity(Gravity.CENTER); -// LayoutParams nameParams = new LayoutParams(LayoutParams.MATCH_PARENT, priceBgHeight); // 使用自定义属性 -// nameParams.addRule(ALIGN_PARENT_BOTTOM); -// addView(giftNameLabel, nameParams); -// -// // 调整层级 -// bringChildToFront(giftPriceBgView); -// bringChildToFront(giftCoin); -// } -// -// public void setIsLockGift(boolean isLockGift) { -// this.isLockGift = isLockGift; -// -// // 设置背景图片(使用自定义属性) -// int bgResource = isLockGift ? lockBgRes : normalBgRes; -// bgImageView.setImageResource(bgResource); -// -// // 显示/隐藏光效背景 -// giftBgImageView.setVisibility(isLockGift ? View.VISIBLE : View.GONE); -// -// // 调整礼物图片尺寸(使用自定义属性) -// LayoutParams params = (LayoutParams) giftImageView.getLayoutParams(); -// if (isLockGift) { -// params.width = lockGiftSize; -// params.height = lockGiftSize; -// params.setMargins(0, 0, 0, 0); -// } else { -// params.width = LayoutParams.MATCH_PARENT; -// params.height = LayoutParams.WRAP_CONTENT; -// params.setMargins(giftImageMargin, giftImageMargin, giftImageMargin, 0); -// } -// giftImageView.setLayoutParams(params); -// } -// -// public void setModel(Object model) { -// this.model = model; -// // 实际业务中解析模型数据 -// /* -// if (model instanceof QXDrawGiftModel) { -// QXDrawGiftModel giftModel = (QXDrawGiftModel) model; -// giftNameLabel.setText(giftModel.getGiftName()); -// giftCoin.setText(giftModel.getGiftPrice()); -// // Glide.with(getContext()).load(giftModel.getBaseImage()).into(giftImageView); -// } -// */ -// } -// -// public void startAnimation() { -// // 礼物图片顺时针旋转(使用自定义动画时长) -// RotateAnimation rotateAnimation = new RotateAnimation( -// 0, 360, -// Animation.RELATIVE_TO_SELF, 0.5f, -// Animation.RELATIVE_TO_SELF, 0.5f -// ); -// rotateAnimation.setDuration(rotateDuration); -// rotateAnimation.setRepeatCount(Animation.INFINITE); -// rotateAnimation.setRepeatMode(Animation.RESTART); -// rotateAnimation.setInterpolator(getContext(), android.R.anim.linear_interpolator); -// giftImageView.startAnimation(rotateAnimation); -// -// // 光效背景逆时针旋转 -// RotateAnimation rotateAnimation1 = new RotateAnimation( -// 0, -360, -// Animation.RELATIVE_TO_SELF, 0.5f, -// Animation.RELATIVE_TO_SELF, 0.5f -// ); -// rotateAnimation1.setDuration(rotateDuration); -// rotateAnimation1.setRepeatCount(Animation.INFINITE); -// rotateAnimation1.setRepeatMode(Animation.RESTART); -// rotateAnimation1.setInterpolator(getContext(), android.R.anim.linear_interpolator); -// giftBgImageView.startAnimation(rotateAnimation1); -// } -// -// public void resetAnimation() { -// giftImageView.clearAnimation(); -// giftBgImageView.clearAnimation(); -// } -// -// public void stopAnimation() { -// giftImageView.clearAnimation(); -// giftBgImageView.clearAnimation(); -// } -// -// // dp转px -// private int dp2px(int dp) { -// return (int) TypedValue.applyDimension( -// TypedValue.COMPLEX_UNIT_DIP, -// dp, -// getResources().getDisplayMetrics() -// ); -// } -// -// // sp转px -// private int sp2px(int sp) { -// return (int) TypedValue.applyDimension( -// TypedValue.COMPLEX_UNIT_SP, -// sp, -// getResources().getDisplayMetrics() -// ); -// } -// -// // Getter方法 -// public TextView getGiftNameLabel() { return giftNameLabel; } -// public ImageView getGiftPriceBgView() { return giftPriceBgView; } -// public Button getGiftCoin() { return giftCoin; } -// public ImageView getBgImageView() { return bgImageView; } -// public ImageView getGiftBgImageView() { return giftBgImageView; } -// public ImageView getGiftImageView() { return giftImageView; } -// public boolean isLockGift() { return isLockGift; } -// public Object getModel() { return model; } -//} +package com.xscm.moduleutil.view; + +import android.content.Context; + + + +import android.content.res.TypedArray; +import android.graphics.drawable.Drawable; +import android.util.AttributeSet; +import android.util.TypedValue; +import android.view.Gravity; +import android.view.View; +import android.view.animation.Animation; +import android.view.animation.RotateAnimation; +import android.widget.Button; +import android.widget.ImageView; +import android.widget.RelativeLayout; +import android.widget.TextView; + +import androidx.annotation.Nullable; + +import com.xscm.moduleutil.R; + + +public class QXMeetGiftView extends RelativeLayout { + + private TextView giftNameLabel; + private ImageView giftPriceBgView; + private Button giftCoin; + private ImageView bgImageView; + private ImageView giftBgImageView; + private ImageView giftImageView; + + // 自定义属性变量 + private int normalBgRes; + private int lockBgRes; + private int giftLightBgRes; + private int priceBgRes; + private int coinIconRes; + private int giftNameColor; + private int coinTextColor; + private float giftNameSize; + private float coinTextSize; + private int bgBottomMargin; + private int giftImageMargin; + private int priceBgHeight; + private int priceBgBottomMargin; + private int lockGiftSize; + private int rotateDuration; + + private boolean isLockGift; + private Object model; + + public QXMeetGiftView(Context context) { + this(context, null); + } + + public QXMeetGiftView(Context context, @Nullable AttributeSet attrs) { + this(context, attrs, 0); + } + + public QXMeetGiftView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + // 解析自定义属性 + initAttrs(context, attrs); + // 初始化子视图 + initSubviews(context); + } + + /** + * 解析自定义属性,设置默认值 + */ + private void initAttrs(Context context, AttributeSet attrs) { + TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.QXMeetGiftView); + + // 背景资源(默认使用原代码中的资源) + normalBgRes = ta.getResourceId(R.styleable.QXMeetGiftView_normalBg, R.mipmap.xlh_g_2); + lockBgRes = ta.getResourceId(R.styleable.QXMeetGiftView_lockBg, R.mipmap.ic_launcher); + giftLightBgRes = ta.getResourceId(R.styleable.QXMeetGiftView_giftLightBg, R.mipmap.jinb); + priceBgRes = ta.getResourceId(R.styleable.QXMeetGiftView_priceBg, R.mipmap.ic_launcher); + coinIconRes = ta.getResourceId(R.styleable.QXMeetGiftView_coinIcon, R.mipmap.ic_launcher); + + // 文字样式 + giftNameColor = ta.getColor(R.styleable.QXMeetGiftView_giftNameColor, 0xFFFFFFFF); + coinTextColor = ta.getColor(R.styleable.QXMeetGiftView_coinTextColor, 0xFFC7BF62); + giftNameSize = ta.getDimension(R.styleable.QXMeetGiftView_giftNameSize, sp2px(12)); + coinTextSize = ta.getDimension(R.styleable.QXMeetGiftView_coinTextSize, sp2px(10)); + + // 尺寸配置 + bgBottomMargin = ta.getDimensionPixelOffset(R.styleable.QXMeetGiftView_bgBottomMargin, dp2px(19)); + giftImageMargin = ta.getDimensionPixelOffset(R.styleable.QXMeetGiftView_giftImageMargin, dp2px(6)); + priceBgHeight = ta.getDimensionPixelOffset(R.styleable.QXMeetGiftView_priceBgHeight, dp2px(15)); + priceBgBottomMargin = ta.getDimensionPixelOffset(R.styleable.QXMeetGiftView_priceBgBottomMargin, dp2px(15)); + lockGiftSize = ta.getDimensionPixelOffset(R.styleable.QXMeetGiftView_lockGiftSize, dp2px(62)); + + // 动画时长 + rotateDuration = ta.getInt(R.styleable.QXMeetGiftView_rotateDuration, 3000); + + ta.recycle(); // 回收资源,避免内存泄漏 + } + + private void initSubviews(Context context) { + // 1. 主背景 + bgImageView = new ImageView(context); + bgImageView.setScaleType(ImageView.ScaleType.FIT_XY); + bgImageView.setImageResource(normalBgRes); // 使用自定义属性 + LayoutParams bgParams = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT); + bgParams.addRule(ALIGN_PARENT_TOP); + bgParams.addRule(ALIGN_PARENT_LEFT); + bgParams.addRule(ALIGN_PARENT_RIGHT); + bgParams.bottomMargin = bgBottomMargin; // 使用自定义属性 + addView(bgImageView, bgParams); + + // 2. 礼物光效背景 + giftBgImageView = new ImageView(context); + giftBgImageView.setScaleType(ImageView.ScaleType.FIT_XY); + giftBgImageView.setImageResource(giftLightBgRes); // 使用自定义属性 + giftBgImageView.setVisibility(View.GONE); + LayoutParams giftBgParams = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT); + giftBgParams.addRule(ALIGN_PARENT_TOP); + giftBgParams.addRule(ALIGN_PARENT_LEFT); + giftBgParams.addRule(ALIGN_PARENT_RIGHT); + giftBgParams.bottomMargin = bgBottomMargin; // 使用自定义属性 + addView(giftBgImageView, giftBgParams); + + // 3. 礼物图片 + giftImageView = new ImageView(context); + giftImageView.setScaleType(ImageView.ScaleType.FIT_CENTER); + LayoutParams giftImageParams = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT); + giftImageParams.addRule(CENTER_IN_PARENT); + giftImageParams.setMargins(giftImageMargin, giftImageMargin, giftImageMargin, 0); // 使用自定义属性 + addView(giftImageView, giftImageParams); + + // 4. 价格背景 + giftPriceBgView = new ImageView(context); + giftPriceBgView.setImageResource(priceBgRes); // 使用自定义属性 + LayoutParams priceBgParams = new LayoutParams(LayoutParams.MATCH_PARENT, priceBgHeight); // 使用自定义属性 + priceBgParams.addRule(ALIGN_PARENT_BOTTOM); + priceBgParams.bottomMargin = priceBgBottomMargin; // 使用自定义属性 + addView(giftPriceBgView, priceBgParams); + + // 5. 金币按钮 + giftCoin = new Button(context); + giftCoin.setTextColor(coinTextColor); // 使用自定义属性 + giftCoin.setTextSize(TypedValue.COMPLEX_UNIT_PX, coinTextSize); // 使用自定义属性 + // 金币图标 + Drawable coinDrawable = getResources().getDrawable(coinIconRes); // 使用自定义属性 + coinDrawable.setBounds(0, 0, dp2px(12), dp2px(12)); + giftCoin.setCompoundDrawables(coinDrawable, null, null, null); + giftCoin.setBackgroundColor(0x00000000); // 透明背景 + LayoutParams coinParams = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); + coinParams.addRule(CENTER_IN_PARENT, TRUE); + addView(giftCoin, coinParams); + + // 6. 礼物名称 + giftNameLabel = new TextView(context); + giftNameLabel.setTextColor(giftNameColor); // 使用自定义属性 + giftNameLabel.setTextSize(TypedValue.COMPLEX_UNIT_PX, giftNameSize); // 使用自定义属性 + giftNameLabel.setGravity(Gravity.CENTER); + LayoutParams nameParams = new LayoutParams(LayoutParams.MATCH_PARENT, priceBgHeight); // 使用自定义属性 + nameParams.addRule(ALIGN_PARENT_BOTTOM); + addView(giftNameLabel, nameParams); + + // 调整层级 + bringChildToFront(giftPriceBgView); + bringChildToFront(giftCoin); + } + + public void setIsLockGift(boolean isLockGift) { + this.isLockGift = isLockGift; + + // 设置背景图片(使用自定义属性) + int bgResource = isLockGift ? lockBgRes : normalBgRes; + bgImageView.setImageResource(bgResource); + + // 显示/隐藏光效背景 + giftBgImageView.setVisibility(isLockGift ? View.VISIBLE : View.GONE); + + // 调整礼物图片尺寸(使用自定义属性) + LayoutParams params = (LayoutParams) giftImageView.getLayoutParams(); + if (isLockGift) { + params.width = lockGiftSize; + params.height = lockGiftSize; + params.setMargins(0, 0, 0, 0); + } else { + params.width = LayoutParams.MATCH_PARENT; + params.height = LayoutParams.WRAP_CONTENT; + params.setMargins(giftImageMargin, giftImageMargin, giftImageMargin, 0); + } + giftImageView.setLayoutParams(params); + } + + public void setModel(Object model) { + this.model = model; + // 实际业务中解析模型数据 + /* + if (model instanceof QXDrawGiftModel) { + QXDrawGiftModel giftModel = (QXDrawGiftModel) model; + giftNameLabel.setText(giftModel.getGiftName()); + giftCoin.setText(giftModel.getGiftPrice()); + // Glide.with(getContext()).load(giftModel.getBaseImage()).into(giftImageView); + } + */ + } + + public void startAnimation() { + // 礼物图片顺时针旋转(使用自定义动画时长) + RotateAnimation rotateAnimation = new RotateAnimation( + 0, 360, + Animation.RELATIVE_TO_SELF, 0.5f, + Animation.RELATIVE_TO_SELF, 0.5f + ); + rotateAnimation.setDuration(rotateDuration); + rotateAnimation.setRepeatCount(Animation.INFINITE); + rotateAnimation.setRepeatMode(Animation.RESTART); + rotateAnimation.setInterpolator(getContext(), android.R.anim.linear_interpolator); + giftImageView.startAnimation(rotateAnimation); + + // 光效背景逆时针旋转 + RotateAnimation rotateAnimation1 = new RotateAnimation( + 0, -360, + Animation.RELATIVE_TO_SELF, 0.5f, + Animation.RELATIVE_TO_SELF, 0.5f + ); + rotateAnimation1.setDuration(rotateDuration); + rotateAnimation1.setRepeatCount(Animation.INFINITE); + rotateAnimation1.setRepeatMode(Animation.RESTART); + rotateAnimation1.setInterpolator(getContext(), android.R.anim.linear_interpolator); + giftBgImageView.startAnimation(rotateAnimation1); + } + + public void resetAnimation() { + giftImageView.clearAnimation(); + giftBgImageView.clearAnimation(); + } + + public void stopAnimation() { + giftImageView.clearAnimation(); + giftBgImageView.clearAnimation(); + } + + // dp转px + private int dp2px(int dp) { + return (int) TypedValue.applyDimension( + TypedValue.COMPLEX_UNIT_DIP, + dp, + getResources().getDisplayMetrics() + ); + } + + // sp转px + private int sp2px(int sp) { + return (int) TypedValue.applyDimension( + TypedValue.COMPLEX_UNIT_SP, + sp, + getResources().getDisplayMetrics() + ); + } + + // Getter方法 + public TextView getGiftNameLabel() { return giftNameLabel; } + public ImageView getGiftPriceBgView() { return giftPriceBgView; } + public Button getGiftCoin() { return giftCoin; } + public ImageView getBgImageView() { return bgImageView; } + public ImageView getGiftBgImageView() { return giftBgImageView; } + public ImageView getGiftImageView() { return giftImageView; } + public boolean isLockGift() { return isLockGift; } + public Object getModel() { return model; } +} diff --git a/moduleUtil/src/main/res/values/attr.xml b/moduleUtil/src/main/res/values/attr.xml index a8945b4..7e1e090 100644 --- a/moduleUtil/src/main/res/values/attr.xml +++ b/moduleUtil/src/main/res/values/attr.xml @@ -469,4 +469,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file