admin
2024-01-26 c2d382d99ca506932985d1843d4371d6ed0203ff
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
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;
        }
 
    }
 
 
}