diff --git a/app/src/main/java/com/fongmi/android/tv/api/config/WallConfig.java b/app/src/main/java/com/fongmi/android/tv/api/config/WallConfig.java index 265dbd2bf..de742d12f 100644 --- a/app/src/main/java/com/fongmi/android/tv/api/config/WallConfig.java +++ b/app/src/main/java/com/fongmi/android/tv/api/config/WallConfig.java @@ -112,7 +112,7 @@ public class WallConfig { } private void createSnapshot(File file) throws Exception { - Bitmap bitmap = Glide.with(App.get()).asBitmap().load(file).override(ResUtil.getScreenWidth(), ResUtil.getScreenHeight()).skipMemoryCache(true).diskCacheStrategy(DiskCacheStrategy.NONE).submit().get(); + Bitmap bitmap = Glide.with(App.get()).asBitmap().frame(0).load(file).override(ResUtil.getScreenWidth(), ResUtil.getScreenHeight()).skipMemoryCache(true).diskCacheStrategy(DiskCacheStrategy.NONE).submit().get(); try (FileOutputStream fos = new FileOutputStream(FileUtil.getWallCache())) { bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fos); } diff --git a/app/src/main/java/com/fongmi/android/tv/ui/adapter/BaseDiffAdapter.java b/app/src/main/java/com/fongmi/android/tv/ui/adapter/BaseDiffAdapter.java index 5c11cc094..0c04a92d3 100644 --- a/app/src/main/java/com/fongmi/android/tv/ui/adapter/BaseDiffAdapter.java +++ b/app/src/main/java/com/fongmi/android/tv/ui/adapter/BaseDiffAdapter.java @@ -37,9 +37,13 @@ public abstract class BaseDiffAdapter, VH extends Recycler } public void addItem(T item) { + addItem(item, null); + } + + public void addItem(T item, Runnable commitCallback) { List current = new ArrayList<>(getItems()); current.add(item); - setItems(current); + setItems(current, commitCallback); } public void addItems(List items) { diff --git a/app/src/mobile/java/com/fongmi/android/tv/ui/activity/VideoActivity.java b/app/src/mobile/java/com/fongmi/android/tv/ui/activity/VideoActivity.java index 398f57a76..87de209ac 100644 --- a/app/src/mobile/java/com/fongmi/android/tv/ui/activity/VideoActivity.java +++ b/app/src/mobile/java/com/fongmi/android/tv/ui/activity/VideoActivity.java @@ -124,13 +124,13 @@ public class VideoActivity extends BaseActivity implements Clock.Callback, Custo private Observer mObserveSearch; private EpisodeAdapter mEpisodeAdapter; private QualityAdapter mQualityAdapter; - private ValueAnimator mHeightAnimator; private ControlDialog mControlDialog; private QuickAdapter mQuickAdapter; private ParseAdapter mParseAdapter; private ExecutorService mExecutor; private SiteViewModel mViewModel; private FlagAdapter mFlagAdapter; + private ValueAnimator mAnimator; private CustomKeyDown mKeyDown; private List mBroken; private History mHistory; @@ -400,9 +400,9 @@ public class VideoActivity extends BaseActivity implements Clock.Callback, Custo } private void setAnimator() { - mHeightAnimator = new ValueAnimator(); - mHeightAnimator.setInterpolator(new DecelerateInterpolator()); - mHeightAnimator.addUpdateListener(animation -> { + mAnimator = new ValueAnimator(); + mAnimator.setInterpolator(new DecelerateInterpolator()); + mAnimator.addUpdateListener(animation -> { mFrameParams.height = (int) animation.getAnimatedValue(); mBinding.video.setLayoutParams(mFrameParams); }); @@ -1219,10 +1219,10 @@ public class VideoActivity extends BaseActivity implements Clock.Callback, Custo int calculated = (int) (parentWidth * ((float) videoHeight / videoWidth)); int finalHeight = Math.max(minHeight, Math.min(maxHeight, calculated)); if (finalHeight == mBinding.video.getHeight()) return; - if (mHeightAnimator.isRunning()) mHeightAnimator.cancel(); - mHeightAnimator.setIntValues(mBinding.video.getHeight(), finalHeight); - mHeightAnimator.setDuration(300); - mHeightAnimator.start(); + if (mAnimator.isRunning()) mAnimator.cancel(); + mAnimator.setIntValues(mBinding.video.getHeight(), finalHeight); + mAnimator.setDuration(300); + mAnimator.start(); } private void checkEnded(boolean notify) { diff --git a/app/src/mobile/java/com/fongmi/android/tv/ui/fragment/CollectFragment.java b/app/src/mobile/java/com/fongmi/android/tv/ui/fragment/CollectFragment.java index dc884a5fd..90739e822 100644 --- a/app/src/mobile/java/com/fongmi/android/tv/ui/fragment/CollectFragment.java +++ b/app/src/mobile/java/com/fongmi/android/tv/ui/fragment/CollectFragment.java @@ -1,5 +1,6 @@ package com.fongmi.android.tv.ui.fragment; +import android.animation.ValueAnimator; import android.os.Bundle; import android.view.LayoutInflater; import android.view.Menu; @@ -43,6 +44,7 @@ public class CollectFragment extends BaseFragment implements MenuProvider, Colle private CustomScroller mScroller; private SiteViewModel mViewModel; private PauseExecutor mExecutor; + private ValueAnimator mAnimator; private int maxWidth; public static CollectFragment newInstance(String keyword) { @@ -74,17 +76,17 @@ public class CollectFragment extends BaseFragment implements MenuProvider, Colle @Override protected void initView() { - maxWidth = ResUtil.getScreenWidth() / (ResUtil.isLand(requireActivity()) ? 3 : 2) - ResUtil.dp2px(32); + maxWidth = ResUtil.getScreenWidth() / (getCount() + 1) - ResUtil.dp2px(32); mScroller = new CustomScroller(this); setRecyclerView(); setViewModel(); + setAnimator(); search(); } private void setRecyclerView() { - mBinding.collect.setMaxWidth(maxWidth); mBinding.collect.setItemAnimator(null); - mBinding.collect.setHasFixedSize(false); + mBinding.collect.setHasFixedSize(true); mBinding.collect.setAdapter(mCollectAdapter = new CollectAdapter(this)); mBinding.recycler.setHasFixedSize(true); mBinding.recycler.addOnScrollListener(mScroller); @@ -98,6 +100,15 @@ public class CollectFragment extends BaseFragment implements MenuProvider, Colle mViewModel.result.observe(this, this::setSearch); } + private void setAnimator() { + mAnimator = new ValueAnimator(); + mAnimator.addUpdateListener(animation -> { + ViewGroup.LayoutParams params = mBinding.collect.getLayoutParams(); + params.width = (Integer) animation.getAnimatedValue(); + mBinding.collect.setLayoutParams(params); + }); + } + private List getSites() { List items = new ArrayList<>(); for (Site site : VodConfig.get().getSites()) if (site.isSearchable()) items.add(site); @@ -128,10 +139,25 @@ public class CollectFragment extends BaseFragment implements MenuProvider, Colle private void setCollect(Result result) { if (result == null) return; if (mCollectAdapter.getPosition() == 0) mSearchAdapter.addItems(result.getList()); - mCollectAdapter.addItem(Collect.create(result.getList())); + mCollectAdapter.addItem(Collect.create(result.getList()), this::setWidth); mCollectAdapter.add(result.getList()); } + private void setWidth() { + int maxTextWidth = 0; + int space = ResUtil.dp2px(48); + for (Collect item : mCollectAdapter.getItems()) maxTextWidth = Math.max(maxTextWidth, ResUtil.getTextWidth(item.getSite().getName(), 14)); + int contentWidth = maxTextWidth + space; + int minWidth = ResUtil.dp2px(120); + int finalWidth = Math.max(minWidth, Math.min(contentWidth, maxWidth)); + int startWidth = mBinding.collect.getWidth(); + if (finalWidth == startWidth) return; + if (mAnimator.isRunning()) mAnimator.cancel(); + mAnimator.setIntValues(startWidth, finalWidth); + mAnimator.setDuration(300); + mAnimator.start(); + } + private void setSearch(Result result) { if (result == null) return; boolean same = !result.getList().isEmpty() && mCollectAdapter.getActivated().getSite().equals(result.getList().get(0).getSite());