diff --git a/app/src/main/java/com/nnbc123/app/common/widget/RectRoundImageView.java b/app/src/main/java/com/nnbc123/app/common/widget/RectRoundImageView.java index bb1c29951..93f4fa772 100644 --- a/app/src/main/java/com/nnbc123/app/common/widget/RectRoundImageView.java +++ b/app/src/main/java/com/nnbc123/app/common/widget/RectRoundImageView.java @@ -2,33 +2,24 @@ package com.nnbc123.app.common.widget; import android.content.Context; import android.content.res.TypedArray; -import android.graphics.Bitmap; -import android.graphics.Bitmap.Config; -import android.graphics.BitmapFactory; -import android.graphics.Canvas; -import android.graphics.Color; -import android.graphics.Paint; -import android.graphics.PixelFormat; -import android.graphics.PorterDuff; -import android.graphics.PorterDuffXfermode; -import android.graphics.RectF; -import android.graphics.drawable.BitmapDrawable; -import android.graphics.drawable.Drawable; +import android.graphics.Outline; import android.util.AttributeSet; import android.util.TypedValue; -import android.widget.ImageView; +import android.view.View; +import android.view.ViewOutlineProvider; +import com.google.android.material.imageview.ShapeableImageView; +import com.google.android.material.shape.CornerFamily; +import com.google.android.material.shape.ShapeAppearanceModel; import com.nnbc123.app.R; -import java.io.InputStream; - /** * 自定义View,实现圆角,圆形等效果 * * @author zhy */ -public class RectRoundImageView extends ImageView { +public class RectRoundImageView extends ShapeableImageView { /** * TYPE_CIRCLE / TYPE_ROUND @@ -37,42 +28,11 @@ public class RectRoundImageView extends ImageView { public static final int TYPE_CIRCLE = 0; public static final int TYPE_ROUND = 1; - /** - * 图片 - */ - private Bitmap mSrc; - /** * 圆角的大小 */ private int mRadius = 8; - /** - * 控件的宽度 - */ - private int mWidth; - /** - * 控件的高度 - */ - private int mHeight; - - - public int getType() { - return type; - } - - public void setType(int type) { - this.type = type; - } - - public int getmRadius() { - return mRadius; - } - - public void setmRadius(int mRadius) { - this.mRadius = mRadius; - } - public RectRoundImageView(Context context, AttributeSet attrs) { this(context, attrs, 0); } @@ -98,17 +58,6 @@ public class RectRoundImageView extends ImageView { for (int i = 0; i < n; i++) { int attr = a.getIndex(i); switch (attr) { - case R.styleable.RectRoundImageView_src: -// mSrc = BitmapFactory.decodeResource(getResources(), -// a.getResourceId(attr, 0)); - InputStream is = getResources().openRawResource(a.getResourceId(attr, 0)); - BitmapFactory.Options opts = new BitmapFactory.Options(); - opts.inTempStorage = new byte[100 * 1024]; - opts.inPreferredConfig = Config.RGB_565; - opts.inPurgeable = true; - opts.inSampleSize = 4; - mSrc = BitmapFactory.decodeStream(is, null, opts); - break; case R.styleable.RectRoundImageView_type: type = a.getInt(attr, 0);// 默认为Circle break; @@ -121,197 +70,25 @@ public class RectRoundImageView extends ImageView { } setScaleType(ScaleType.CENTER_CROP); a.recycle(); + setup(type, mRadius); } - - /** - * 计算控件的高度和宽度 - */ - @Override - protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { - super.onMeasure(widthMeasureSpec, heightMeasureSpec); - Drawable drawable = getDrawable(); - if (null != drawable) { - mSrc = drawableToBitmap(getDrawable()); - } - /** - * 设置宽度 - */ - int specMode = MeasureSpec.getMode(widthMeasureSpec); - int specSize = MeasureSpec.getSize(widthMeasureSpec); - - if (specMode == MeasureSpec.EXACTLY)// match_parent , accurate - { - mWidth = specSize; - } else { - // 由图片决定的宽 - int desireByImg = getPaddingLeft() + getPaddingRight() - + mSrc.getWidth(); - if (specMode == MeasureSpec.AT_MOST)// wrap_content - { - mWidth = Math.min(desireByImg, specSize); - } else - mWidth = desireByImg; - } - - /*** - * 设置高度 - */ - - specMode = MeasureSpec.getMode(heightMeasureSpec); - specSize = MeasureSpec.getSize(heightMeasureSpec); - if (specMode == MeasureSpec.EXACTLY)// match_parent , accurate - { - mHeight = specSize; - } else { - int desire = getPaddingTop() + getPaddingBottom() - + mSrc.getHeight(); - - if (specMode == MeasureSpec.AT_MOST)// wrap_content - { - mHeight = Math.min(desire, specSize); - } else - mHeight = desire; - } - - setMeasuredDimension(mWidth, mHeight); - - } - - /** - * 绘制 - */ - @Override - protected void onDraw(Canvas canvas) { - - switch (type) { - // 如果是TYPE_CIRCLE绘制圆形 - case TYPE_CIRCLE: - int min = Math.min(mWidth, mHeight); - /** - * 长度如果不一致,按小的值进行压缩 - */ - if (null != mSrc) { - mSrc = Bitmap.createScaledBitmap(mSrc, min, min, false); - canvas.drawBitmap(createCircleImage(mSrc, min), 0, 0, null); + private void setup(int type, int cornerSize) { + if (type == TYPE_CIRCLE) { + setOutlineProvider(new ViewOutlineProvider() { + @Override + public void getOutline(View view, Outline outline) { + int min = Math.min(view.getWidth(), view.getHeight()); + int left = (view.getWidth() - min) / 2; + int top = (view.getHeight() - min) / 2; + outline.setOval(left, top, min, min); } - break; - case TYPE_ROUND: - canvas.drawBitmap(createFramedPhoto(mWidth, mHeight, mSrc, mRadius), 0, 0, null); - break; + }); + setClipToOutline(true); + } else if (type == TYPE_ROUND) { + setShapeAppearanceModel(ShapeAppearanceModel.builder() + .setAllCorners(CornerFamily.ROUNDED, cornerSize) + .build()); } - - } - - - /** - * Drawable → Bitmap - * - * @param drawable - * @return - */ - - public static Bitmap drawableToBitmap(Drawable drawable) { - - - Bitmap bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(), - - drawable.getIntrinsicHeight(), - - drawable.getOpacity() != PixelFormat.OPAQUE ? Config.ARGB_8888 - - : Config.RGB_565); - - Canvas canvas = new Canvas(bitmap); - - //canvas.setBitmap(bitmap); - - drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight()); - - drawable.draw(canvas); - - return bitmap; - - } - - /** - * 根据原图和变长绘制圆形图片 - * - * @param source - * @param min - * @return - */ - private Bitmap createCircleImage(Bitmap source, int min) { - final Paint paint = new Paint(); - paint.setAntiAlias(true); - Bitmap target = Bitmap.createBitmap(min, min, Config.RGB_565); - /** - * 产生一个同样大小的画布 - */ - Canvas canvas = new Canvas(target); - /** - * 首先绘制圆形 - */ - canvas.drawCircle(min / 2, min / 2, min / 2, paint); - /** - * 使用SRC_IN,参考上面的说明 - */ - paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN)); - /** - * 绘制图片 - */ - canvas.drawBitmap(source, 0, 0, paint); - return target; - } - - /** - * 根据原图添加圆角 - * - * @param source - * @return - */ - private Bitmap createRoundConerImage(Bitmap source) { - final Paint paint = new Paint(); - paint.setAntiAlias(true); - Bitmap target = Bitmap.createBitmap(mWidth, mHeight, Config.ARGB_8888); - Canvas canvas = new Canvas(target); - RectF rect = new RectF(0, 0, source.getWidth(), source.getHeight()); - canvas.drawRoundRect(rect, mRadius, mRadius, paint); - paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN)); - canvas.drawBitmap(source, 0, 0, paint); - return target; - } - - /** - * @param x 图像的宽度 - * @param y 图像的高度 - * @param image 源图片 - * @param outerRadiusRat 圆角的大小 - * @return 圆角图片 - */ - Bitmap createFramedPhoto(int x, int y, Bitmap image, float outerRadiusRat) { - //根据源文件新建一个darwable对象 - Drawable imageDrawable = new BitmapDrawable(image); - // 新建一个新的输出图片 - Bitmap output = Bitmap.createBitmap(x, y, Config.ARGB_8888); - - Canvas canvas = new Canvas(output); - - // 新建一个矩形 - RectF outerRect = new RectF(0, 0, x, y); - - // 产生一个红色的圆角矩形 - Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG); - paint.setColor(Color.RED); - canvas.drawRoundRect(outerRect, outerRadiusRat, outerRadiusRat, paint); - - // 将源图片绘制到这个圆角矩形上 - paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN)); - imageDrawable.setBounds(0, 0, x, y); - canvas.saveLayer(outerRect, paint, Canvas.ALL_SAVE_FLAG); - imageDrawable.draw(canvas); - canvas.restore(); - - return output; } } diff --git a/app/src/main/java/com/nnbc123/app/home/adapter/HomeMagicIndicatorAdapter.java b/app/src/main/java/com/nnbc123/app/home/adapter/HomeMagicIndicatorAdapter.java new file mode 100644 index 000000000..941a3f196 --- /dev/null +++ b/app/src/main/java/com/nnbc123/app/home/adapter/HomeMagicIndicatorAdapter.java @@ -0,0 +1,128 @@ +package com.nnbc123.app.home.adapter; + +import android.content.Context; +import android.graphics.Color; +import android.view.Gravity; +import android.view.ViewGroup; +import android.widget.FrameLayout; +import android.widget.LinearLayout; +import android.widget.TextView; + +import com.nnbc123.app.R; +import com.nnbc123.app.ui.widget.XRecyclerView.ScaleTransitionPagerTitleView; +import com.nnbc123.app.ui.widget.magicindicator.buildins.UIUtil; +import com.nnbc123.app.ui.widget.magicindicator.buildins.commonnavigator.abs.CommonNavigatorAdapter; +import com.nnbc123.app.ui.widget.magicindicator.buildins.commonnavigator.abs.IPagerIndicator; +import com.nnbc123.app.ui.widget.magicindicator.buildins.commonnavigator.abs.IPagerTitleView; +import com.nnbc123.app.ui.widget.magicindicator.buildins.commonnavigator.indicators.DrawableIndicator; + +import java.util.List; + +public class HomeMagicIndicatorAdapter extends CommonNavigatorAdapter { + + private final List mTitleList; + + private int textSize = 20; + private float minScale = 0.7f; + protected int mNormalColor = Color.BLACK; + protected int mSelectedColor = Color.BLACK; + private boolean showIndicator = true; + private int resId = R.drawable.home_bg_indicator; + + public HomeMagicIndicatorAdapter(Context context, List charSequences ) { + this.mTitleList = charSequences; + } + + @Override + public int getCount() { + return mTitleList == null ? 0 : mTitleList.size(); + } + + + @Override + public IPagerTitleView getTitleView(Context context, final int i) { + ScaleTransitionPagerTitleView scaleTransitionPagerTitleView = new ScaleTransitionPagerTitleView(context, true); + scaleTransitionPagerTitleView.setNormalColor(mNormalColor); + scaleTransitionPagerTitleView.setSelectedColor(mSelectedColor); + scaleTransitionPagerTitleView.setMinScale(minScale); + scaleTransitionPagerTitleView.setTextSize(textSize); + scaleTransitionPagerTitleView.setAutoResetPivot(true); +// int padding = UIUtil.dip2px(context, 5); +// scaleTransitionPagerTitleView.setPadding(padding, 0, padding, 0); + scaleTransitionPagerTitleView.setText(mTitleList.get(i)); + scaleTransitionPagerTitleView.setOnClickListener(view -> { + if (mOnItemSelectListener != null) { + mOnItemSelectListener.onItemSelect(i, scaleTransitionPagerTitleView); + } + + }); + return scaleTransitionPagerTitleView; + } + + + @Override + public IPagerIndicator getIndicator(Context context) { + if (!showIndicator) return null; + DrawableIndicator indicator = new DrawableIndicator(context); + indicator.setMode(DrawableIndicator.MODE_MATCH_EDGE); + indicator.setIndicatorDrawable(context.getResources().getDrawable(resId)); + LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, UIUtil.dip2px(context, 28)); + lp.gravity = Gravity.CENTER_VERTICAL; + indicator.setLayoutParams(lp); + return indicator; + } + + public void setResId(int resId) { + this.resId = resId; + } + + public int getTextSize() { + return textSize; + } + + public void setTextSize(int textSize) { + this.textSize = textSize; + } + + public float getMinScale() { + return minScale; + } + + public void setMinScale(float minScale) { + this.minScale = minScale; + } + + public int getSelectedColor() { + return mSelectedColor; + } + + public void setSelectedColor(int selectedColor) { + mSelectedColor = selectedColor; + } + + public int getNormalColor() { + return mNormalColor; + } + + public void setNormalColor(int normalColor) { + mNormalColor = normalColor; + } + + public boolean isShowIndicator() { + return showIndicator; + } + + public void setShowIndicator(boolean showIndicator) { + this.showIndicator = showIndicator; + } + + private OnItemSelectListener mOnItemSelectListener; + + public void setOnItemSelectListener(OnItemSelectListener onItemSelectListener) { + mOnItemSelectListener = onItemSelectListener; + } + + public interface OnItemSelectListener { + void onItemSelect(int position, TextView view); + } +} diff --git a/app/src/main/java/com/nnbc123/app/home/fragment/HomeFragment2.kt b/app/src/main/java/com/nnbc123/app/home/fragment/HomeFragment2.kt index 9deb1ed62..44519d09a 100644 --- a/app/src/main/java/com/nnbc123/app/home/fragment/HomeFragment2.kt +++ b/app/src/main/java/com/nnbc123/app/home/fragment/HomeFragment2.kt @@ -1,13 +1,17 @@ package com.nnbc123.app.home.fragment +import android.graphics.Color +import android.view.Gravity import android.widget.LinearLayout +import com.chuhai.utils.ktx.getColorById import com.chuhai.utils.ktx.singleClick +import com.gyf.immersionbar.ImmersionBar import com.nnbc123.app.R import com.nnbc123.app.avroom.adapter.RoomVPAdapter import com.nnbc123.app.base.BaseBindingFragment import com.nnbc123.app.databinding.HomeFragmentBinding import com.nnbc123.app.home.activity.MoreRoomActivity -import com.nnbc123.app.home.adapter.MainMagicIndicatorAdapter +import com.nnbc123.app.home.adapter.HomeMagicIndicatorAdapter import com.nnbc123.app.ui.widget.magicindicator.ViewPagerHelper import com.nnbc123.app.ui.widget.magicindicator.buildins.commonnavigator.CommonNavigator import com.nnbc123.library.annatation.ActLayoutRes @@ -19,6 +23,7 @@ import com.nnbc123.library.annatation.ActLayoutRes @ActLayoutRes(R.layout.home_fragment) class HomeFragment2 : BaseBindingFragment() { override fun initiate() { + ImmersionBar.with(this).titleBarMarginTop(mBinding.magicIndicator).init() initTab() initEvent() } @@ -41,10 +46,10 @@ class HomeFragment2 : BaseBindingFragment() { val fragmentList = listOf(PartyFragment2(), MakeFriendsFragment()) val commonNavigator = CommonNavigator(context) commonNavigator.setTitleWrapContent(true) - val magicIndicatorAdapter = MainMagicIndicatorAdapter(context, tagList) - magicIndicatorAdapter.setResId(R.drawable.ic_home_indicator_center) - magicIndicatorAdapter.textSize = 16 - magicIndicatorAdapter.minScale = 0.85f + commonNavigator.setTitleGravity(Gravity.CENTER_VERTICAL) + val magicIndicatorAdapter = HomeMagicIndicatorAdapter(context, tagList) + magicIndicatorAdapter.normalColor = Color.parseColor("#696D7A") + magicIndicatorAdapter.selectedColor = Color.parseColor("#2B2D33") commonNavigator.adapter = magicIndicatorAdapter mBinding.magicIndicator.navigator = commonNavigator commonNavigator.titleContainer.showDividers = LinearLayout.SHOW_DIVIDER_MIDDLE diff --git a/app/src/main/java/com/nnbc123/app/home/fragment/PartyFragment2.kt b/app/src/main/java/com/nnbc123/app/home/fragment/PartyFragment2.kt index c02ee373d..160d62f43 100644 --- a/app/src/main/java/com/nnbc123/app/home/fragment/PartyFragment2.kt +++ b/app/src/main/java/com/nnbc123/app/home/fragment/PartyFragment2.kt @@ -1,11 +1,21 @@ package com.nnbc123.app.home.fragment +import androidx.core.view.isVisible +import androidx.fragment.app.activityViewModels import androidx.viewpager2.widget.ViewPager2 import com.nnbc123.app.R +import com.nnbc123.app.avroom.activity.AVRoomActivity import com.nnbc123.app.base.BaseBindingFragment import com.nnbc123.app.databinding.HomePartyFragmentBinding +import com.nnbc123.app.home.HomeViewModel import com.nnbc123.app.home.adapter.PartyHotMessageAdapter -import com.nnbc123.app.home.adapter.PartyRoomAdapter +import com.nnbc123.app.home.dialog.RecommendRoomDialog +import com.nnbc123.app.home.helper.BannerHelper +import com.nnbc123.app.ui.utils.load +import com.nnbc123.app.ui.webview.CommonWebViewActivity +import com.nnbc123.core.auth.AuthModel +import com.nnbc123.core.statistic.StatisticManager +import com.nnbc123.core.statistic.protocol.StatisticsProtocol import com.nnbc123.library.annatation.ActLayoutRes /** @@ -14,20 +24,106 @@ import com.nnbc123.library.annatation.ActLayoutRes **/ @ActLayoutRes(R.layout.home_party_fragment) class PartyFragment2 : BaseBindingFragment() { + + private val homeViewModel: HomeViewModel by activityViewModels() + + //仅埋点使用,不影响业务逻辑 + private val abcArray = arrayOf("A", "B", "C", "D") + private var currMatchClick = abcArray[0] + override fun initiate() { + initResource() + initHotMessage() + initBanner() requireActivity().supportFragmentManager .beginTransaction() .replace(R.id.fragment_container_view, PartyRoomFragment()) .commitAllowingStateLoss() - mBinding.bannerView.apply { + loadData() + } + + private fun loadData() { + homeViewModel.getHomeResource() + homeViewModel.getBannerInfo() + } + + private fun initHotMessage() { + mBinding.hotMessage.apply { setOrientation(ViewPager2.ORIENTATION_VERTICAL) setAdapter(PartyHotMessageAdapter()) setLifecycleRegistry(lifecycle) }.create() - mBinding.bannerView.refreshData(ArrayList().apply { + mBinding.hotMessage.refreshData(ArrayList().apply { repeat(3) { add(it.toString()) } }) + + mBinding.hotMessage.isVisible = true + } + + private fun initResource(){ + homeViewModel.resourceLiveData.observe(this) { + if (it.isNullOrEmpty()) { + mBinding.groupResource.isVisible = false + return@observe + } + mBinding.groupResource.isVisible = true + val resourceViews = arrayOf( + mBinding.ivResource0, + mBinding.ivResource1, + mBinding.ivResource2, + mBinding.ivResource3 + ) + for (i in resourceViews.indices) { + resourceViews[i].load(it[i].icon) + resourceViews[i].setOnClickListener { _ -> + currMatchClick = abcArray[i] + StatisticManager.Instance().onEvent( + "${currMatchClick}_match_click", + "资源位点击", + mapOf("user_id" to AuthModel.get().currentUid.toString()) + ) + when { + it[i].resourceType == 5 -> { + CommonWebViewActivity.start(context, it[i].resourceContent) + } + i == 3 -> { + dialogManager.showProgressDialog(mContext) + homeViewModel.getHomeChatPick() + } + else -> { + dialogManager.showProgressDialog(mContext) + homeViewModel.getResourceJumpInfo(it[i].id) + } + } + } + } + } + + homeViewModel.resourceJumpLiveData.observe(this) { + dialogManager.dismissDialog() + it?.let { + if (it.isPick) { + AVRoomActivity.start(context, it.uid) + StatisticManager.Instance().onEvent( + "${currMatchClick}_match_success", + "资源位匹配成功", + mapOf("user_id" to AuthModel.get().currentUid.toString()) + ) + } else { + RecommendRoomDialog.newInstance(it).show(context) + } + } + } + } + + private fun initBanner() { + homeViewModel.bannerLiveData.observe(this) { + BannerHelper.setBanner(mBinding.rollView, it) { _, _ -> + StatisticManager.Instance() + .onEvent(StatisticsProtocol.EVENT_HOME_BANNER_CLICK, "首页_banner") + } + } } } \ No newline at end of file diff --git a/app/src/main/java/com/nnbc123/app/ui/widget/XRecyclerView/ScaleTransitionPagerTitleView.java b/app/src/main/java/com/nnbc123/app/ui/widget/XRecyclerView/ScaleTransitionPagerTitleView.java index 31ad1f9e9..33240b106 100644 --- a/app/src/main/java/com/nnbc123/app/ui/widget/XRecyclerView/ScaleTransitionPagerTitleView.java +++ b/app/src/main/java/com/nnbc123/app/ui/widget/XRecyclerView/ScaleTransitionPagerTitleView.java @@ -22,6 +22,8 @@ public class ScaleTransitionPagerTitleView extends ColorTransitionPagerTitleView private boolean isAlwaysBold; + private boolean autoResetPivot; + public ScaleTransitionPagerTitleView(Context context, boolean selectedBold) { super(context); this.selectedBold = selectedBold; @@ -34,6 +36,10 @@ public class ScaleTransitionPagerTitleView extends ColorTransitionPagerTitleView @Override public void onEnter(int index, int totalCount, float enterPercent, boolean leftToRight) { super.onEnter(index, totalCount, enterPercent, leftToRight); + if (autoResetPivot) { + setPivotX(getWidth() / 2f); + setPivotY(getHeight() / 2f); + } // 实现颜色渐变 setScaleX(mMinScale + (1.0f - mMinScale) * enterPercent); setScaleY(mMinScale + (1.0f - mMinScale) * enterPercent); @@ -42,6 +48,10 @@ public class ScaleTransitionPagerTitleView extends ColorTransitionPagerTitleView @Override public void onLeave(int index, int totalCount, float leavePercent, boolean leftToRight) { super.onLeave(index, totalCount, leavePercent, leftToRight); + if (autoResetPivot) { + setPivotX(getWidth() / 2f); + setPivotY(getHeight() / 2f); + } // 实现颜色渐变 setScaleX(1.0f + (mMinScale - 1.0f) * leavePercent); setScaleY(1.0f + (mMinScale - 1.0f) * leavePercent); @@ -82,4 +92,8 @@ public class ScaleTransitionPagerTitleView extends ColorTransitionPagerTitleView invalidate(); } + public void setAutoResetPivot(boolean state) { + autoResetPivot = state; + } + } diff --git a/app/src/main/java/com/nnbc123/app/ui/widget/magicindicator/buildins/commonnavigator/CommonNavigator.java b/app/src/main/java/com/nnbc123/app/ui/widget/magicindicator/buildins/commonnavigator/CommonNavigator.java index 72135eb70..424dd4471 100644 --- a/app/src/main/java/com/nnbc123/app/ui/widget/magicindicator/buildins/commonnavigator/CommonNavigator.java +++ b/app/src/main/java/com/nnbc123/app/ui/widget/magicindicator/buildins/commonnavigator/CommonNavigator.java @@ -184,7 +184,7 @@ public class CommonNavigator extends FrameLayout implements IPagerNavigator, Nav if (mAdapter != null) { mIndicator = mAdapter.getIndicator(getContext()); if (mIndicator instanceof View) { - LayoutParams lp = (LayoutParams) ((View) mIndicator).getLayoutParams(); + ViewGroup.LayoutParams lp = ((View) mIndicator).getLayoutParams(); if (lp == null) { lp = new LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT); } diff --git a/app/src/main/java/com/nnbc123/app/ui/widget/magicindicator/buildins/commonnavigator/indicators/DrawableIndicator.java b/app/src/main/java/com/nnbc123/app/ui/widget/magicindicator/buildins/commonnavigator/indicators/DrawableIndicator.java new file mode 100644 index 000000000..b7c6210c5 --- /dev/null +++ b/app/src/main/java/com/nnbc123/app/ui/widget/magicindicator/buildins/commonnavigator/indicators/DrawableIndicator.java @@ -0,0 +1,177 @@ +package com.nnbc123.app.ui.widget.magicindicator.buildins.commonnavigator.indicators; + +import android.content.Context; +import android.graphics.Canvas; +import android.graphics.Rect; +import android.graphics.drawable.Drawable; +import android.view.View; +import android.view.animation.Interpolator; +import android.view.animation.LinearInterpolator; + +import com.nnbc123.app.ui.widget.magicindicator.FragmentContainerHelper; +import com.nnbc123.app.ui.widget.magicindicator.buildins.commonnavigator.abs.IPagerIndicator; +import com.nnbc123.app.ui.widget.magicindicator.buildins.commonnavigator.model.PositionData; + +import java.util.List; + + +public class DrawableIndicator extends View implements IPagerIndicator { + public static final int MODE_MATCH_EDGE = 0; // drawable宽度 == title宽度 - 2 * mXOffset + public static final int MODE_WRAP_CONTENT = 1; // drawable宽度 == title内容宽度 - 2 * mXOffset + public static final int MODE_EXACTLY = 2; + + private int mMode; // 默认为MODE_MATCH_EDGE模式 + private Drawable mIndicatorDrawable; + + // 控制动画 + private Interpolator mStartInterpolator = new LinearInterpolator(); + private Interpolator mEndInterpolator = new LinearInterpolator(); + + private float mDrawableHeight; + private float mDrawableWidth; + private float mYOffset; + private float mXOffset; + + private List mPositionDataList; + private Rect mDrawableRect = new Rect(); + + public DrawableIndicator(Context context) { + super(context); + } + + @Override + public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { + if (mIndicatorDrawable == null) { + return; + } + + if (mPositionDataList == null || mPositionDataList.isEmpty()) { + return; + } + + // 计算锚点位置 + PositionData current = FragmentContainerHelper.getImitativePositionData(mPositionDataList, position); + PositionData next = FragmentContainerHelper.getImitativePositionData(mPositionDataList, position + 1); + + float leftX; + float nextLeftX; + float rightX; + float nextRightX; + if (mMode == MODE_MATCH_EDGE) { + leftX = current.mLeft + mXOffset; + nextLeftX = next.mLeft + mXOffset; + rightX = current.mRight - mXOffset; + nextRightX = next.mRight - mXOffset; + mDrawableRect.top = (int) mYOffset; + mDrawableRect.bottom = (int) (getHeight() - mYOffset); + } else if (mMode == MODE_WRAP_CONTENT) { + leftX = current.mContentLeft + mXOffset; + nextLeftX = next.mContentLeft + mXOffset; + rightX = current.mContentRight - mXOffset; + nextRightX = next.mContentRight - mXOffset; + mDrawableRect.top = (int) (current.mContentTop - mYOffset); + mDrawableRect.bottom = (int) (current.mContentBottom + mYOffset); + } else { // MODE_EXACTLY + leftX = current.mLeft + (current.width() - mDrawableWidth) / 2; + nextLeftX = next.mLeft + (next.width() - mDrawableWidth) / 2; + rightX = current.mLeft + (current.width() + mDrawableWidth) / 2; + nextRightX = next.mLeft + (next.width() + mDrawableWidth) / 2; + mDrawableRect.top = (int) (getHeight() - mDrawableHeight - mYOffset); + mDrawableRect.bottom = (int) (getHeight() - mYOffset); + } + + mDrawableRect.left = (int) (leftX + (nextLeftX - leftX) * mStartInterpolator.getInterpolation(positionOffset)); + mDrawableRect.right = (int) (rightX + (nextRightX - rightX) * mEndInterpolator.getInterpolation(positionOffset)); + mIndicatorDrawable.setBounds(mDrawableRect); + + invalidate(); + } + + @Override + public void onPageSelected(int position) { + } + + @Override + public void onPageScrollStateChanged(int state) { + } + + @Override + protected void onDraw(Canvas canvas) { + if (mIndicatorDrawable != null) { + mIndicatorDrawable.draw(canvas); + } + } + + @Override + public void onPositionDataProvide(List dataList) { + mPositionDataList = dataList; + } + + public Drawable getIndicatorDrawable() { + return mIndicatorDrawable; + } + + public void setIndicatorDrawable(Drawable indicatorDrawable) { + mIndicatorDrawable = indicatorDrawable; + } + + public Interpolator getStartInterpolator() { + return mStartInterpolator; + } + + public void setStartInterpolator(Interpolator startInterpolator) { + mStartInterpolator = startInterpolator; + } + + public Interpolator getEndInterpolator() { + return mEndInterpolator; + } + + public void setEndInterpolator(Interpolator endInterpolator) { + mEndInterpolator = endInterpolator; + } + + public int getMode() { + return mMode; + } + + public void setMode(int mode) { + if (mode == MODE_EXACTLY || mode == MODE_MATCH_EDGE || mode == MODE_WRAP_CONTENT) { + mMode = mode; + } else { + throw new IllegalArgumentException("mode " + mode + " not supported."); + } + } + + public float getDrawableHeight() { + return mDrawableHeight; + } + + public void setDrawableHeight(float drawableHeight) { + mDrawableHeight = drawableHeight; + } + + public float getDrawableWidth() { + return mDrawableWidth; + } + + public void setDrawableWidth(float drawableWidth) { + mDrawableWidth = drawableWidth; + } + + public float getYOffset() { + return mYOffset; + } + + public void setYOffset(float yOffset) { + mYOffset = yOffset; + } + + public float getXOffset() { + return mXOffset; + } + + public void setXOffset(float xOffset) { + mXOffset = xOffset; + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable-xhdpi/ic_home_my_room.png b/app/src/main/res/drawable-xhdpi/ic_home_my_room.png deleted file mode 100644 index ee3c5513c..000000000 Binary files a/app/src/main/res/drawable-xhdpi/ic_home_my_room.png and /dev/null differ diff --git a/app/src/main/res/drawable-xhdpi/ic_home_rank.png b/app/src/main/res/drawable-xhdpi/ic_home_rank.png deleted file mode 100644 index f526406bc..000000000 Binary files a/app/src/main/res/drawable-xhdpi/ic_home_rank.png and /dev/null differ diff --git a/app/src/main/res/drawable-xxhdpi/home_bg_indicator.webp b/app/src/main/res/drawable-xxhdpi/home_bg_indicator.webp new file mode 100644 index 000000000..444f3082d Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/home_bg_indicator.webp differ diff --git a/app/src/main/res/drawable-xxhdpi/home_bg_top.webp b/app/src/main/res/drawable-xxhdpi/home_bg_top.webp new file mode 100644 index 000000000..474a21048 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/home_bg_top.webp differ diff --git a/app/src/main/res/drawable-xxhdpi/home_ic_my_room.webp b/app/src/main/res/drawable-xxhdpi/home_ic_my_room.webp new file mode 100644 index 000000000..d67705973 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/home_ic_my_room.webp differ diff --git a/app/src/main/res/drawable-xxhdpi/home_ic_rank.webp b/app/src/main/res/drawable-xxhdpi/home_ic_rank.webp new file mode 100644 index 000000000..2ea18219c Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/home_ic_rank.webp differ diff --git a/app/src/main/res/drawable-xxhdpi/home_ic_resource_more.webp b/app/src/main/res/drawable-xxhdpi/home_ic_resource_more.webp new file mode 100644 index 000000000..cb96caec7 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/home_ic_resource_more.webp differ diff --git a/app/src/main/res/drawable/home_ic_search.xml b/app/src/main/res/drawable/home_ic_search.xml new file mode 100644 index 000000000..f2b7b3e71 --- /dev/null +++ b/app/src/main/res/drawable/home_ic_search.xml @@ -0,0 +1,12 @@ + + + diff --git a/app/src/main/res/layout/fragment_home.xml b/app/src/main/res/layout/fragment_home.xml index af57e531c..f1b5f4ed8 100644 --- a/app/src/main/res/layout/fragment_home.xml +++ b/app/src/main/res/layout/fragment_home.xml @@ -67,7 +67,7 @@ android:layout_marginBottom="4dp" android:onClick="@{click}" android:scaleType="center" - android:src="@drawable/ic_home_rank" /> + android:src="@drawable/home_ic_rank" /> diff --git a/app/src/main/res/layout/home_fragment.xml b/app/src/main/res/layout/home_fragment.xml index 868a48a3d..02d4bc177 100644 --- a/app/src/main/res/layout/home_fragment.xml +++ b/app/src/main/res/layout/home_fragment.xml @@ -1,63 +1,71 @@ - + + android:layout_height="match_parent"> + + + app:layout_constraintTop_toTopOf="@id/magic_indicator"> - - + android:paddingStart="@dimen/dp_9" + android:paddingEnd="@dimen/dp_32" + android:text="搜索ID、房间" + android:textColor="#B8B7C7" + android:textSize="@dimen/dp_12" /> + android:layout_marginEnd="@dimen/dp_8" + android:scaleType="fitCenter" + android:src="@drawable/home_ic_my_room" + android:visibility="gone" + tools:visibility="visible" /> + + diff --git a/app/src/main/res/layout/home_party_fragment.xml b/app/src/main/res/layout/home_party_fragment.xml index 04d6bef48..8234ca208 100644 --- a/app/src/main/res/layout/home_party_fragment.xml +++ b/app/src/main/res/layout/home_party_fragment.xml @@ -32,169 +32,122 @@ app:contentScrim="@color/transparent" app:layout_scrollFlags="scroll|enterAlwaysCollapsed"> - + android:layout_height="wrap_content"> - + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + android:visibility="gone" + app:constraint_referenced_ids="iv_resource_0,iv_resource_1,iv_resource_2,iv_resource_3,iv_resource_4" + tools:visibility="visible" /> + app:bvp_scroll_duration="500" + app:layout_constraintTop_toBottomOf="@id/iv_resource_2" + tools:background="@drawable/default_banner" + tools:visibility="visible" /> - + + - - - - - - + android:layout_marginStart="@dimen/dp_19" + android:layout_marginTop="@dimen/dp_12" + android:paddingBottom="@dimen/dp_4" + android:text="热门推荐" + android:textColor="#2B2D33" + android:textSize="@dimen/dp_16" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@id/roll_view" /> + diff --git a/gradle.properties b/gradle.properties index 8dc3093e9..20299533c 100644 --- a/gradle.properties +++ b/gradle.properties @@ -29,5 +29,5 @@ COMPILE_SDK_VERSION=32 MIN_SDK_VERSION=21 TARGET_SDK_VERSION=32 -version_name=1.3.2 -version_code=132 \ No newline at end of file +version_name=2.0.0 +version_code=2000 \ No newline at end of file diff --git a/library/build.gradle b/library/build.gradle index 1881ea3a2..6df601859 100644 --- a/library/build.gradle +++ b/library/build.gradle @@ -141,6 +141,8 @@ dependencies { // 网络请求chrome数据调试 api 'com.facebook.stetho:stetho:1.5.1' api 'com.facebook.stetho:stetho-okhttp3:1.5.1' + + api 'com.geyifeng.immersionbar:immersionbar:3.2.2' } repositories { mavenCentral()