package com.weikou.beibeivideo.ui.main;
|
|
import android.content.Context;
|
import android.graphics.Canvas;
|
import android.graphics.Color;
|
import android.graphics.Paint;
|
import android.graphics.RectF;
|
import android.os.Build;
|
import android.os.Bundle;
|
import android.util.Log;
|
import android.view.Gravity;
|
import android.view.View;
|
import android.view.ViewGroup;
|
import android.view.animation.Interpolator;
|
import android.view.animation.LinearInterpolator;
|
|
import com.kwad.sdk.api.KsAdSDK;
|
import com.kwad.sdk.api.KsContentPage;
|
import com.kwad.sdk.api.KsFeedPage;
|
import com.kwad.sdk.api.KsScene;
|
import com.weikou.beibeivideo.R;
|
import com.weikou.beibeivideo.entity.ad.AdPositionEnum;
|
import com.weikou.beibeivideo.ui.MyRetainViewFragment;
|
import com.weikou.beibeivideo.util.ad.AdUtil;
|
import com.weikou.beibeivideo.util.ad.KSConstant;
|
import com.weikou.beibeivideo.widget.MySwipeRefreshLayout;
|
|
import net.lucode.hackware.magicindicator.FragmentContainerHelper;
|
import net.lucode.hackware.magicindicator.MagicIndicator;
|
import net.lucode.hackware.magicindicator.ViewPagerHelper;
|
import net.lucode.hackware.magicindicator.buildins.ArgbEvaluatorHolder;
|
import net.lucode.hackware.magicindicator.buildins.UIUtil;
|
import net.lucode.hackware.magicindicator.buildins.commonnavigator.CommonNavigator;
|
import net.lucode.hackware.magicindicator.buildins.commonnavigator.abs.CommonNavigatorAdapter;
|
import net.lucode.hackware.magicindicator.buildins.commonnavigator.abs.IPagerIndicator;
|
import net.lucode.hackware.magicindicator.buildins.commonnavigator.abs.IPagerTitleView;
|
import net.lucode.hackware.magicindicator.buildins.commonnavigator.indicators.LinePagerIndicator;
|
import net.lucode.hackware.magicindicator.buildins.commonnavigator.model.PositionData;
|
import net.lucode.hackware.magicindicator.buildins.commonnavigator.titles.ColorTransitionPagerTitleView;
|
|
import java.util.Arrays;
|
import java.util.List;
|
|
import androidx.annotation.NonNull;
|
import androidx.annotation.Nullable;
|
import androidx.fragment.app.Fragment;
|
import androidx.fragment.app.FragmentManager;
|
import androidx.fragment.app.FragmentStatePagerAdapter;
|
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
|
import androidx.viewpager.widget.ViewPager;
|
|
/**
|
* 主页面--快手视频
|
*/
|
public class FeedVideoFragment extends MyRetainViewFragment {
|
private static final String TAG = "KSFeedFragment";
|
private ViewPager vp_feed_videos;
|
private MagicIndicator magic_indicator;
|
|
public FeedVideoFragment() {
|
super();
|
}
|
|
public FeedVideoFragment(FragmentManager fragmentManager) {
|
super();
|
setName(FeedVideoFragment.class.getName());
|
}
|
|
|
@Override
|
public int getContentResource() {
|
return R.layout.fragment_feed_videos;
|
}
|
|
@Override
|
public void onCreateView(View contentView, Bundle savedInstanceState) {
|
Log.i(TAG, "onCreateView");
|
initView(contentView);
|
init();
|
}
|
|
private void initView(View view) {
|
magic_indicator = view.findViewById(R.id.magic_indicator);
|
vp_feed_videos = view.findViewById(R.id.vp_feed_videos);
|
}
|
|
|
public void init() {
|
vp_feed_videos.setAdapter(new FeedVideoTypesAdapter(getChildFragmentManager()));
|
CommonNavigator commonNavigator = new CommonNavigator(getActivity());
|
commonNavigator.setAdapter(navigatorAdapter);
|
commonNavigator.setAdjustMode(true);
|
magic_indicator.setNavigator(commonNavigator);
|
ViewPagerHelper.bind(magic_indicator, vp_feed_videos);
|
vp_feed_videos.setCurrentItem(0);
|
if (getTypeCount() <= 1) {
|
magic_indicator.setVisibility(View.GONE);
|
}
|
}
|
|
|
private CommonNavigatorAdapter navigatorAdapter = new CommonNavigatorAdapter() {
|
|
@Override
|
public int getCount() {
|
return getTypeCount();
|
}
|
|
|
@Override
|
public IPagerTitleView getTitleView(final Context context, final int index) {
|
ColorTransitionPagerTitleView colorTransitionPagerTitleView = new ColorTransitionPagerTitleView(context);
|
colorTransitionPagerTitleView.setNormalColor(Color.parseColor("#FF717481"));
|
colorTransitionPagerTitleView.setSelectedColor(Color.parseColor("#FF159FFF"));
|
colorTransitionPagerTitleView.setText(index == 0 ? "热门" : "推荐");
|
colorTransitionPagerTitleView.setLayoutParams(new ViewGroup.LayoutParams(UIUtil.dip2px(context, 114), ViewPager.LayoutParams.WRAP_CONTENT));
|
colorTransitionPagerTitleView.setGravity(Gravity.CENTER);
|
// colorTransitionPagerTitleView.setBackgroundColor(Color.RED);
|
colorTransitionPagerTitleView.setOnClickListener(new View.OnClickListener() {
|
@Override
|
public void onClick(View view) {
|
vp_feed_videos.setCurrentItem(index);
|
}
|
});
|
colorTransitionPagerTitleView.setTextSize(12);
|
return colorTransitionPagerTitleView;
|
}
|
|
//此为tab指示器回调
|
@Override
|
public IPagerIndicator getIndicator(Context context) {
|
LinePagerIndicator indicator = new LinePagerIndicator(context);
|
indicator.setColors(Color.parseColor("#FFF8F8F8"));
|
indicator.setMode(LinePagerIndicator.MODE_MATCH_EDGE);
|
indicator.setRoundRadius(UIUtil.dip2px(context, 20));
|
indicator.setLineHeight(UIUtil.dip2px(context, 20));
|
indicator.setYOffset(UIUtil.dip2px(context, 0));
|
|
return indicator;
|
}
|
};
|
|
class FeedVideoNavIndicator extends View implements IPagerIndicator {
|
|
public static final int MODE_MATCH_EDGE = 0; // 直线宽度 == title宽度 - 2 * mXOffset
|
public static final int MODE_WRAP_CONTENT = 1; // 直线宽度 == title内容宽度 - 2 * mXOffset
|
public static final int MODE_EXACTLY = 2; // 直线宽度 == mLineWidth
|
|
private int mMode; // 默认为MODE_MATCH_EDGE模式
|
|
// 控制动画
|
private Interpolator mStartInterpolator = new LinearInterpolator();
|
private Interpolator mEndInterpolator = new LinearInterpolator();
|
|
private float mYOffset; // 相对于底部的偏移量,如果你想让直线位于title上方,设置它即可
|
private float mLineHeight;
|
private float mXOffset;
|
private float mLineWidth;
|
private float mRoundRadius;
|
|
private Paint mPaint;
|
private List<PositionData> mPositionDataList;
|
private List<Integer> mColors;
|
|
private RectF mLineRect = new RectF();
|
|
public FeedVideoNavIndicator(Context context) {
|
super(context);
|
init(context);
|
}
|
|
private void init(Context context) {
|
mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
|
mPaint.setStyle(Paint.Style.STROKE);
|
mPaint.setStrokeWidth(UIUtil.dip2px(getContext(), 1));
|
mLineHeight = UIUtil.dip2px(context, 3);
|
mLineWidth = UIUtil.dip2px(context, 10);
|
}
|
|
@Override
|
protected void onDraw(Canvas canvas) {
|
canvas.drawRoundRect(mLineRect, mRoundRadius, mRoundRadius, mPaint);
|
|
}
|
|
@Override
|
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
|
if (mPositionDataList == null || mPositionDataList.isEmpty()) {
|
return;
|
}
|
|
// 计算颜色
|
if (mColors != null && mColors.size() > 0) {
|
int currentColor = mColors.get(Math.abs(position) % mColors.size());
|
int nextColor = mColors.get(Math.abs(position + 1) % mColors.size());
|
int color = ArgbEvaluatorHolder.eval(positionOffset, currentColor, nextColor);
|
mPaint.setColor(color);
|
}
|
|
// 计算锚点位置
|
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;
|
} else if (mMode == MODE_WRAP_CONTENT) {
|
leftX = current.mContentLeft + mXOffset;
|
nextLeftX = next.mContentLeft + mXOffset;
|
rightX = current.mContentRight - mXOffset;
|
nextRightX = next.mContentRight - mXOffset;
|
} else { // MODE_EXACTLY
|
leftX = current.mLeft + (current.width() - mLineWidth) / 2;
|
nextLeftX = next.mLeft + (next.width() - mLineWidth) / 2;
|
rightX = current.mLeft + (current.width() + mLineWidth) / 2;
|
nextRightX = next.mLeft + (next.width() + mLineWidth) / 2;
|
}
|
|
mLineRect.left = leftX + (nextLeftX - leftX) * mStartInterpolator.getInterpolation(positionOffset);
|
mLineRect.right = rightX + (nextRightX - rightX) * mEndInterpolator.getInterpolation(positionOffset);
|
mLineRect.top = getHeight() - mLineHeight - mYOffset;
|
mLineRect.bottom = getHeight() - mYOffset;
|
|
invalidate();
|
}
|
|
@Override
|
public void onPageSelected(int position) {
|
}
|
|
@Override
|
public void onPageScrollStateChanged(int state) {
|
}
|
|
@Override
|
public void onPositionDataProvide(List<PositionData> dataList) {
|
mPositionDataList = dataList;
|
}
|
|
public float getYOffset() {
|
return mYOffset;
|
}
|
|
public void setYOffset(float yOffset) {
|
mYOffset = yOffset;
|
}
|
|
public float getXOffset() {
|
return mXOffset;
|
}
|
|
public void setXOffset(float xOffset) {
|
mXOffset = xOffset;
|
}
|
|
public float getLineHeight() {
|
return mLineHeight;
|
}
|
|
public void setLineHeight(float lineHeight) {
|
mLineHeight = lineHeight;
|
}
|
|
public float getLineWidth() {
|
return mLineWidth;
|
}
|
|
public void setLineWidth(float lineWidth) {
|
mLineWidth = lineWidth;
|
}
|
|
public float getRoundRadius() {
|
return mRoundRadius;
|
}
|
|
public void setRoundRadius(float roundRadius) {
|
mRoundRadius = roundRadius;
|
}
|
|
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 Paint getPaint() {
|
return mPaint;
|
}
|
|
public List<Integer> getColors() {
|
return mColors;
|
}
|
|
public void setColors(Integer... colors) {
|
mColors = Arrays.asList(colors);
|
}
|
|
public Interpolator getStartInterpolator() {
|
return mStartInterpolator;
|
}
|
|
public void setStartInterpolator(Interpolator startInterpolator) {
|
mStartInterpolator = startInterpolator;
|
if (mStartInterpolator == null) {
|
mStartInterpolator = new LinearInterpolator();
|
}
|
}
|
|
public Interpolator getEndInterpolator() {
|
return mEndInterpolator;
|
}
|
|
public void setEndInterpolator(Interpolator endInterpolator) {
|
mEndInterpolator = endInterpolator;
|
if (mEndInterpolator == null) {
|
mEndInterpolator = new LinearInterpolator();
|
}
|
}
|
|
}
|
|
|
class FeedVideoTypesAdapter extends FragmentStatePagerAdapter {
|
|
private FragmentManager fm;
|
|
public FeedVideoTypesAdapter(@NonNull FragmentManager fm) {
|
super(fm);
|
this.fm = fm;
|
}
|
|
@Override
|
public int getItemPosition(@NonNull Object object) {
|
return super.getItemPosition(object);
|
}
|
|
@NonNull
|
@Override
|
public Fragment getItem(int position) {
|
Log.i(TAG, "getItem:" + position);
|
if (getTypeCount() > 1) {
|
if (position == 0) {
|
return new DYFeedFragment(fm);
|
} else {
|
return new KSFeedFragment(fm);
|
}
|
} else {
|
return new KSFeedFragment(fm);
|
}
|
}
|
|
@Override
|
public int getCount() {
|
return getTypeCount();
|
}
|
}
|
|
private int getTypeCount() {
|
if (AdUtil.isCanInitCSJ()&& AdUtil.getAdType(getContext(), AdPositionEnum.splashHotStart) != null) {
|
return 2;
|
} else {
|
return 1;
|
}
|
|
}
|
|
|
}
|