From 163db43a0d25669bc8fdbb1966e0f78b97f934af Mon Sep 17 00:00:00 2001 From: CeuiLiSA <32817377+CeuiLiSA@users.noreply.github.com> Date: Fri, 17 Jul 2020 15:36:39 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E7=89=88=E6=9C=AC=E5=8A=A8=E6=80=81?= =?UTF-8?q?=E9=A1=B5=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle | 1 + .../ceui/lisa/activities/MainActivity.java | 5 +- .../ceui/lisa/activities/NfcDemoActivity.java | 69 ------ .../lisa/activities/TemplateActivity.java | 8 +- .../java/ceui/lisa/activities/VActivity.java | 6 +- .../java/ceui/lisa/adapters/EventAdapter.java | 34 +-- .../java/ceui/lisa/fragments/FragmentBh.java | 19 ++ .../ceui/lisa/fragments/FragmentIllust.java | 32 ++- .../ceui/lisa/fragments/FragmentNewRight.java | 70 ++++++ .../FragmentRightContentBehavior.java | 77 +++++++ .../behavior/FragmentRightHeaderBehavior.java | 37 ++++ .../ceui/lisa/ui/behavior/HeaderBehavior.java | 55 +++++ .../behavior/NestedContentScrollBehavior.java | 82 +++++++ .../behavior/NestedHeaderScrollBehavior.java | 65 ++++++ .../java/ceui/lisa/ui/behavior/Scroll.java | 33 +++ .../drawable/ic_baseline_data_usage_24.xml | 10 + .../main/res/drawable/ic_baseline_dns_24.xml | 10 + .../main/res/drawable/ic_baseline_toys_24.xml | 10 + .../drawable/ic_chevron_right_black_20dp.xml | 10 + .../main/res/drawable/ic_toys_black_24dp.xml | 4 +- app/src/main/res/layout/activity_nfc.xml | 23 -- app/src/main/res/layout/fragment_bh.xml | 201 ++++++++++++++++++ ...fragment_slide.xml => fragment_illust.xml} | 0 .../main/res/layout/fragment_new_right.xml | 173 +++++++++++++++ app/src/main/res/layout/recy_user_event.xml | 134 ++++++------ .../layout/recy_user_preview_horizontal.xml | 22 +- app/src/main/res/values/colors.xml | 6 + 27 files changed, 1003 insertions(+), 193 deletions(-) delete mode 100644 app/src/main/java/ceui/lisa/activities/NfcDemoActivity.java create mode 100644 app/src/main/java/ceui/lisa/fragments/FragmentBh.java create mode 100644 app/src/main/java/ceui/lisa/fragments/FragmentNewRight.java create mode 100644 app/src/main/java/ceui/lisa/ui/behavior/FragmentRightContentBehavior.java create mode 100644 app/src/main/java/ceui/lisa/ui/behavior/FragmentRightHeaderBehavior.java create mode 100644 app/src/main/java/ceui/lisa/ui/behavior/HeaderBehavior.java create mode 100644 app/src/main/java/ceui/lisa/ui/behavior/NestedContentScrollBehavior.java create mode 100644 app/src/main/java/ceui/lisa/ui/behavior/NestedHeaderScrollBehavior.java create mode 100644 app/src/main/java/ceui/lisa/ui/behavior/Scroll.java create mode 100644 app/src/main/res/drawable/ic_baseline_data_usage_24.xml create mode 100644 app/src/main/res/drawable/ic_baseline_dns_24.xml create mode 100644 app/src/main/res/drawable/ic_baseline_toys_24.xml create mode 100644 app/src/main/res/drawable/ic_chevron_right_black_20dp.xml delete mode 100644 app/src/main/res/layout/activity_nfc.xml create mode 100644 app/src/main/res/layout/fragment_bh.xml rename app/src/main/res/layout/{fragment_slide.xml => fragment_illust.xml} (100%) create mode 100644 app/src/main/res/layout/fragment_new_right.xml diff --git a/app/build.gradle b/app/build.gradle index 0e424f35f..216af6495 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -102,6 +102,7 @@ dependencies { implementation 'com.effective.android:panelSwitchHelper-androidx:1.3.1' + implementation 'com.makeramen:roundedimageview:2.3.0' implementation project(path: ':models') implementation project(path: ':base') diff --git a/app/src/main/java/ceui/lisa/activities/MainActivity.java b/app/src/main/java/ceui/lisa/activities/MainActivity.java index 1832a8eeb..a8eca1fe8 100644 --- a/app/src/main/java/ceui/lisa/activities/MainActivity.java +++ b/app/src/main/java/ceui/lisa/activities/MainActivity.java @@ -21,6 +21,7 @@ import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentPagerAdapter; +import com.blankj.utilcode.util.BarUtils; import com.bumptech.glide.Glide; import com.google.android.material.navigation.NavigationView; import com.tbruyelle.rxpermissions2.RxPermissions; @@ -34,6 +35,7 @@ import ceui.lisa.fragments.BaseFragment; import ceui.lisa.fragments.FragmentCenter; import ceui.lisa.fragments.FragmentLeft; +import ceui.lisa.fragments.FragmentNewRight; import ceui.lisa.fragments.FragmentRight; import ceui.lisa.utils.Common; import ceui.lisa.utils.Dev; @@ -90,7 +92,7 @@ private void initFragment() { baseFragments = new BaseFragment[]{ new FragmentLeft(), new FragmentCenter(), - new FragmentRight() + Dev.isDev ? FragmentNewRight.newInstance() : new FragmentRight() }; baseBind.viewPager.setAdapter(new FragmentPagerAdapter(getSupportFragmentManager()) { @Override @@ -104,6 +106,7 @@ public int getCount() { } }); baseBind.navigationView.setupWithViewPager(baseBind.viewPager); + baseBind.viewPager.setCurrentItem(2); } @Override diff --git a/app/src/main/java/ceui/lisa/activities/NfcDemoActivity.java b/app/src/main/java/ceui/lisa/activities/NfcDemoActivity.java deleted file mode 100644 index f03da06d7..000000000 --- a/app/src/main/java/ceui/lisa/activities/NfcDemoActivity.java +++ /dev/null @@ -1,69 +0,0 @@ -package ceui.lisa.activities; - -import android.app.PendingIntent; -import android.content.Intent; -import android.nfc.NfcAdapter; -import android.nfc.Tag; - -import ceui.lisa.R; -import ceui.lisa.base.BaseActivity; -import ceui.lisa.databinding.ActivityNfcBinding; -import ceui.lisa.utils.Common; - -public class NfcDemoActivity extends BaseActivity { - - private NfcAdapter mNfcAdapter; - private PendingIntent pi; - - @Override - protected int initLayout() { - return R.layout.activity_nfc; - } - - @Override - protected void initView() { - mNfcAdapter = NfcAdapter.getDefaultAdapter(this); - - pi = PendingIntent.getActivity(this, 0, new Intent(this, getClass()) - .addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0); - processIntent(getIntent()); - } - - @Override - protected void initData() { - - } - - @Override - protected void onNewIntent(Intent intent) { - super.onNewIntent(intent); - if (NfcAdapter.ACTION_TAG_DISCOVERED.equals(intent.getAction())) { - processIntent(intent); - } - } - - private void processIntent(Intent intent) { - //取出封装在intent中的TAG - Tag tagFromIntent = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG); - String CardId =ByteArrayToHexString(tagFromIntent.getId()); - Common.showLog("CardId " + tagFromIntent.toString()); - Common.showLog("intent " + intent.toString()); - } - - private String ByteArrayToHexString(byte[] inarray) { - int i, j, in; - String[] hex = { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", - "B", "C", "D", "E", "F" }; - String out = ""; - - - for (j = 0; j < inarray.length; ++j) { - in = (int) inarray[j] & 0xff; - i = (in >> 4) & 0x0f; - out += hex[i]; - i = in & 0x0f; - out += hex[i]; - } - return out; - } -} diff --git a/app/src/main/java/ceui/lisa/activities/TemplateActivity.java b/app/src/main/java/ceui/lisa/activities/TemplateActivity.java index a2673d087..738bd5534 100644 --- a/app/src/main/java/ceui/lisa/activities/TemplateActivity.java +++ b/app/src/main/java/ceui/lisa/activities/TemplateActivity.java @@ -15,6 +15,7 @@ import ceui.lisa.databinding.ActivityFragmentBinding; import ceui.lisa.fragments.FragmentAboutApp; import ceui.lisa.fragments.FragmentAnime; +import ceui.lisa.fragments.FragmentBh; import ceui.lisa.fragments.FragmentFileName; import ceui.lisa.fragments.FragmentListSimpleUser; import ceui.lisa.fragments.FragmentMultiDownld; @@ -56,6 +57,7 @@ import ceui.lisa.models.IllustsBean; import ceui.lisa.models.NovelBean; import ceui.lisa.utils.Common; +import ceui.lisa.utils.Dev; import ceui.lisa.utils.Params; import ceui.lisa.utils.ReverseResult; @@ -138,7 +140,11 @@ protected Fragment createNewFragment() { case "一言": return FragmentAnime.newInstance(); case "最新作品": - return new FragmentNew(); + if (Dev.isDev) { + return FragmentBh.newInstance(); + } else { + return new FragmentNew(); + } case "粉丝": return FragmentWhoFollowThisUser.newInstance(intent.getIntExtra(Params.USER_ID, 0)); case "开发者预览": diff --git a/app/src/main/java/ceui/lisa/activities/VActivity.java b/app/src/main/java/ceui/lisa/activities/VActivity.java index ac075fc63..27f85e451 100644 --- a/app/src/main/java/ceui/lisa/activities/VActivity.java +++ b/app/src/main/java/ceui/lisa/activities/VActivity.java @@ -48,7 +48,11 @@ protected void initView() { @Override public Fragment getItem(int position) { if (Shaft.sSettings.isUseFragmentIllust()) { - return FragmentIllust.newInstance(idWithList.getList().get(position)); + if (idWithList.getList().get(position).isGif()) { + return FragmentSingleIllust.newInstance(idWithList.getList().get(position)); + } else { + return FragmentIllust.newInstance(idWithList.getList().get(position)); + } } else { return FragmentSingleIllust.newInstance(idWithList.getList().get(position)); } diff --git a/app/src/main/java/ceui/lisa/adapters/EventAdapter.java b/app/src/main/java/ceui/lisa/adapters/EventAdapter.java index 95ec72ce0..73c1b3b9f 100644 --- a/app/src/main/java/ceui/lisa/adapters/EventAdapter.java +++ b/app/src/main/java/ceui/lisa/adapters/EventAdapter.java @@ -2,7 +2,9 @@ import android.content.Context; import android.text.TextUtils; +import android.view.View; import android.view.ViewGroup; +import android.widget.TextView; import com.bumptech.glide.Glide; @@ -35,25 +37,31 @@ public void bindData(IllustsBean target, ViewHolder bindVi params.width = imageSize; bindView.baseBind.illustImage.setLayoutParams(params); bindView.baseBind.userName.setText(allIllust.get(position).getUser().getName()); - bindView.baseBind.star.setText(allIllust.get(position).isIs_bookmarked() ? "取消收藏" : "收藏"); - if (!TextUtils.isEmpty(allIllust.get(position).getCreate_date())) { - bindView.baseBind.illustDate.setText(allIllust.get(position).getCreate_date().substring(0, 16)); + if (!TextUtils.isEmpty(target.getCaption())) { + bindView.baseBind.description.setVisibility(View.VISIBLE); + bindView.baseBind.description.setHtml(target.getCaption()); + } else { + bindView.baseBind.description.setVisibility(View.GONE); } +// bindView.baseBind.star.setText(allIllust.get(position).isIs_bookmarked() ? "取消收藏" : "收藏"); +// if (!TextUtils.isEmpty(allIllust.get(position).getCreate_date())) { +// bindView.baseBind.illustDate.setText(allIllust.get(position).getCreate_date().substring(0, 16)); +// } Glide.with(mContext).load(GlideUtil.getMediumImg(allIllust.get(position) .getUser().getProfile_image_urls().getMedium())).into(bindView.baseBind.userHead); Glide.with(mContext).load(GlideUtil.getLargeImage(allIllust.get(position))) .placeholder(R.color.light_bg) .into(bindView.baseBind.illustImage); - if (mOnItemClickListener != null) { - bindView.itemView.setOnClickListener(v -> mOnItemClickListener.onItemClick(v, position, 0)); - bindView.baseBind.userHead.setOnClickListener(v -> mOnItemClickListener.onItemClick(v, position, 1)); - bindView.baseBind.download.setOnClickListener(v -> mOnItemClickListener.onItemClick(v, position, 2)); - bindView.baseBind.more.setOnClickListener(v -> mOnItemClickListener.onItemClick(v, position, 4)); - bindView.baseBind.star.setOnClickListener(v -> { - bindView.baseBind.star.setText(allIllust.get(position).isIs_bookmarked() ? "收藏" : "取消收藏"); - mOnItemClickListener.onItemClick(v, position, 3); - }); - } +// if (mOnItemClickListener != null) { +// bindView.itemView.setOnClickListener(v -> mOnItemClickListener.onItemClick(v, position, 0)); +// bindView.baseBind.userHead.setOnClickListener(v -> mOnItemClickListener.onItemClick(v, position, 1)); +// bindView.baseBind.download.setOnClickListener(v -> mOnItemClickListener.onItemClick(v, position, 2)); +// bindView.baseBind.more.setOnClickListener(v -> mOnItemClickListener.onItemClick(v, position, 4)); +// bindView.baseBind.star.setOnClickListener(v -> { +// bindView.baseBind.star.setText(allIllust.get(position).isIs_bookmarked() ? "收藏" : "取消收藏"); +// mOnItemClickListener.onItemClick(v, position, 3); +// }); +// } } } diff --git a/app/src/main/java/ceui/lisa/fragments/FragmentBh.java b/app/src/main/java/ceui/lisa/fragments/FragmentBh.java new file mode 100644 index 000000000..ae8fe7819 --- /dev/null +++ b/app/src/main/java/ceui/lisa/fragments/FragmentBh.java @@ -0,0 +1,19 @@ +package ceui.lisa.fragments; + +import android.os.Bundle; + +import ceui.lisa.R; +import ceui.lisa.base.BaseFragment; +import ceui.lisa.databinding.FragmentBhBinding; + +public class FragmentBh extends BaseFragment { + + public static FragmentBh newInstance() { + return new FragmentBh(); + } + + @Override + protected void initLayout() { + mLayoutID = R.layout.fragment_bh; + } +} diff --git a/app/src/main/java/ceui/lisa/fragments/FragmentIllust.java b/app/src/main/java/ceui/lisa/fragments/FragmentIllust.java index c7577f14f..9fc16af75 100644 --- a/app/src/main/java/ceui/lisa/fragments/FragmentIllust.java +++ b/app/src/main/java/ceui/lisa/fragments/FragmentIllust.java @@ -3,23 +3,35 @@ import android.content.Context; import android.content.Intent; import android.content.IntentFilter; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.graphics.drawable.Drawable; import android.os.Bundle; +import android.text.Spannable; +import android.text.SpannableString; import android.text.TextUtils; +import android.text.style.ImageSpan; import android.view.LayoutInflater; import android.view.MenuItem; import android.view.View; +import android.view.ViewGroup; import android.view.ViewTreeObserver; +import android.widget.LinearLayout; import android.widget.TextView; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.appcompat.widget.Toolbar; +import androidx.core.content.ContextCompat; import androidx.localbroadcastmanager.content.LocalBroadcastManager; import androidx.recyclerview.widget.LinearLayoutManager; -import androidx.recyclerview.widget.RecyclerView; +import com.blankj.utilcode.util.ScreenUtils; import com.bumptech.glide.Glide; import com.google.android.material.bottomsheet.BottomSheetBehavior; +import com.qmuiteam.qmui.span.QMUIAlignMiddleImageSpan; +import com.qmuiteam.qmui.util.QMUIDisplayHelper; +import com.qmuiteam.qmui.util.QMUIDrawableHelper; import com.scwang.smartrefresh.layout.SmartRefreshLayout; import com.zhy.view.flowlayout.FlowLayout; import com.zhy.view.flowlayout.TagAdapter; @@ -32,7 +44,7 @@ import ceui.lisa.activities.UserActivity; import ceui.lisa.adapters.IllustAdapter; import ceui.lisa.base.SwipeFragment; -import ceui.lisa.databinding.FragmentSlideBinding; +import ceui.lisa.databinding.FragmentIllustBinding; import ceui.lisa.dialogs.MuteDialog; import ceui.lisa.download.GifCreate; import ceui.lisa.download.IllustDownload; @@ -48,7 +60,7 @@ import ceui.lisa.utils.ShareIllust; -public class FragmentIllust extends SwipeFragment { +public class FragmentIllust extends SwipeFragment { private IllustsBean illust; @@ -67,7 +79,7 @@ public void initBundle(Bundle bundle) { @Override public void initLayout() { - mLayoutID = R.layout.fragment_slide; + mLayoutID = R.layout.fragment_illust; } @Override @@ -272,6 +284,18 @@ public void onClick(View v) { } } }); + baseBind.illustId.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + Common.copy(mContext, String.valueOf(illust.getId())); + } + }); + baseBind.userId.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + Common.copy(mContext, String.valueOf(illust.getUser().getId())); + } + }); Common.showLog(Shaft.sGson.toJson(illust)); // diff --git a/app/src/main/java/ceui/lisa/fragments/FragmentNewRight.java b/app/src/main/java/ceui/lisa/fragments/FragmentNewRight.java new file mode 100644 index 000000000..efc9e25a1 --- /dev/null +++ b/app/src/main/java/ceui/lisa/fragments/FragmentNewRight.java @@ -0,0 +1,70 @@ +package ceui.lisa.fragments; + +import android.os.Bundle; +import android.view.View; +import android.view.ViewGroup; + +import androidx.recyclerview.widget.LinearLayoutManager; + + +import java.util.ArrayList; +import java.util.List; + +import ceui.lisa.R; +import ceui.lisa.activities.Shaft; +import ceui.lisa.adapters.EventAdapter; +import ceui.lisa.adapters.UserHAdapter; +import ceui.lisa.database.AppDatabase; +import ceui.lisa.database.IllustRecmdEntity; +import ceui.lisa.databinding.FragmentNewRightBinding; +import ceui.lisa.models.IllustsBean; +import ceui.lisa.models.UserPreviewsBean; +import ceui.lisa.utils.DensityUtil; +import ceui.lisa.view.LinearItemHorizontalDecoration; + +public class FragmentNewRight extends BaseFragment { + + public static FragmentNewRight newInstance() { + return new FragmentNewRight(); + } + + @Override + public void initView(View view) { + ViewGroup.LayoutParams headParams = baseBind.head.getLayoutParams(); + headParams.height = Shaft.statusHeight; + baseBind.head.setLayoutParams(headParams); + + baseBind.toolbar.inflateMenu(R.menu.fragment_left); + + baseBind.recyclerView.addItemDecoration(new LinearItemHorizontalDecoration( + DensityUtil.dp2px(16.0f))); + LinearLayoutManager manager = new LinearLayoutManager(mContext, + LinearLayoutManager.HORIZONTAL, false); + baseBind.recyclerView.setLayoutManager(manager); + baseBind.recyclerView.setHasFixedSize(true); + AppDatabase.getAppDatabase(mContext).recmdDao().getAll(); + + + List entities = AppDatabase.getAppDatabase(mContext).recmdDao().getAll(); + List tempUser = new ArrayList<>(); + List tempIllust = new ArrayList<>(); + for (int i = 0; i < entities.size(); i++) { + IllustsBean illustsBean = Shaft.sGson.fromJson( + entities.get(i).getIllustJson(), IllustsBean.class); + UserPreviewsBean userPreviewsBean = new UserPreviewsBean(); + userPreviewsBean.setUser(illustsBean.getUser()); + tempUser.add(userPreviewsBean); + tempIllust.add(illustsBean); + } + baseBind.recyclerView.setAdapter(new UserHAdapter(tempUser, mContext)); + + baseBind.recyList.setLayoutManager(new LinearLayoutManager(mContext)); + baseBind.recyList.setHasFixedSize(true); + baseBind.recyList.setAdapter(new EventAdapter(tempIllust, mContext)); + } + + @Override + public void initLayout() { + mLayoutID = R.layout.fragment_new_right; + } +} diff --git a/app/src/main/java/ceui/lisa/ui/behavior/FragmentRightContentBehavior.java b/app/src/main/java/ceui/lisa/ui/behavior/FragmentRightContentBehavior.java new file mode 100644 index 000000000..fe2e09135 --- /dev/null +++ b/app/src/main/java/ceui/lisa/ui/behavior/FragmentRightContentBehavior.java @@ -0,0 +1,77 @@ +package ceui.lisa.ui.behavior; + +import android.content.Context; +import android.util.AttributeSet; +import android.view.View; + +import androidx.annotation.NonNull; +import androidx.coordinatorlayout.widget.CoordinatorLayout; +import androidx.core.view.ViewCompat; + +import ceui.lisa.R; +import ceui.lisa.utils.Common; +import ceui.lisa.utils.DensityUtil; + +public class FragmentRightContentBehavior extends CoordinatorLayout.Behavior { + + private float headerHeight; + + public FragmentRightContentBehavior() { + } + + public FragmentRightContentBehavior(Context context, AttributeSet attrs) { + super(context, attrs); + } + + @Override + public boolean onLayoutChild(@NonNull CoordinatorLayout parent, @NonNull View child, int layoutDirection) { + + // 首先让父布局按照标准方式解析 + parent.onLayoutChild(child, layoutDirection); + // 获取到 HeaderView 的高度 + headerHeight = parent.findViewById(R.id.imagesTitleBlockLayout).getMeasuredHeight(); + + + // 设置 top 从而排在 HeaderView的下面 + ViewCompat.offsetTopAndBottom(child, (int)headerHeight); + return true; // true 表示我们自己完成了解析 不要再自动解析了 + } + + @Override + public boolean onStartNestedScroll(@NonNull CoordinatorLayout coordinatorLayout, @NonNull View child, @NonNull View directTargetChild, @NonNull View target, int axes, int type) { + return (axes & ViewCompat.SCROLL_AXIS_VERTICAL) != 0; + } + + @Override + public void onNestedPreScroll(@NonNull CoordinatorLayout coordinatorLayout, @NonNull View child, + @NonNull View target, int dx, int dy, @NonNull int[] consumed, int type) { + super.onNestedPreScroll(coordinatorLayout, child, target, dx, dy, consumed, type); + + if (dy > 0) { // 只处理手指上滑 + float newTransY = child.getTranslationY() - dy; + Common.showLog("onNestedPreScroll " + child.getTranslationY() + child.getClass().getSimpleName()); + if (newTransY >= (-headerHeight)) { + // 完全消耗滑动距离后没有完全贴顶或刚好贴顶 + // 那么就声明消耗所有滑动距离,并上移 RecyclerView + consumed[1] = dy; // consumed[0/1] 分别用于声明消耗了x/y方向多少滑动距离 + child.setTranslationY(newTransY); + } else { + consumed[1] = (int)(headerHeight + child.getTranslationY()); + child.setTranslationY(-headerHeight); + } + } + } + + @Override + public void onNestedScroll(@NonNull CoordinatorLayout coordinatorLayout, @NonNull View child, @NonNull View target, int dxConsumed, int dyConsumed, int dxUnconsumed, int dyUnconsumed, int type, @NonNull int[] consumed) { + super.onNestedScroll(coordinatorLayout, child, target, dxConsumed, dyConsumed, dxUnconsumed, dyUnconsumed, type, consumed); + if (dyUnconsumed < 0) { // 只处理手指向下滑动的情况 + float newTransY = child.getTranslationY() - dyUnconsumed; + if (newTransY <= 0) { + child.setTranslationY(newTransY); + } else { + child.setTranslationY(0.0f); + } + } + } +} diff --git a/app/src/main/java/ceui/lisa/ui/behavior/FragmentRightHeaderBehavior.java b/app/src/main/java/ceui/lisa/ui/behavior/FragmentRightHeaderBehavior.java new file mode 100644 index 000000000..693e7f4d2 --- /dev/null +++ b/app/src/main/java/ceui/lisa/ui/behavior/FragmentRightHeaderBehavior.java @@ -0,0 +1,37 @@ +package ceui.lisa.ui.behavior; + +import android.content.Context; +import android.util.AttributeSet; +import android.view.View; + +import androidx.annotation.NonNull; +import androidx.coordinatorlayout.widget.CoordinatorLayout; + +import ceui.lisa.R; +import ceui.lisa.utils.DensityUtil; + +public class FragmentRightHeaderBehavior extends CoordinatorLayout.Behavior { + + public FragmentRightHeaderBehavior() { + } + + public FragmentRightHeaderBehavior(Context context, AttributeSet attrs) { + super(context, attrs); + } + + @Override + public boolean onLayoutChild(@NonNull CoordinatorLayout parent, @NonNull View child, int layoutDirection) { + return super.onLayoutChild(parent, child, layoutDirection); + } + + @Override + public boolean layoutDependsOn(@NonNull CoordinatorLayout parent, @NonNull View child, @NonNull View dependency) { + return dependency.getId() == R.id.content_item; + } + + @Override + public boolean onDependentViewChanged(@NonNull CoordinatorLayout parent, @NonNull View child, @NonNull View dependency) { + child.setTranslationY(dependency.getTranslationY() * 0.6f); + return true; + } +} diff --git a/app/src/main/java/ceui/lisa/ui/behavior/HeaderBehavior.java b/app/src/main/java/ceui/lisa/ui/behavior/HeaderBehavior.java new file mode 100644 index 000000000..8aaa9c533 --- /dev/null +++ b/app/src/main/java/ceui/lisa/ui/behavior/HeaderBehavior.java @@ -0,0 +1,55 @@ +package ceui.lisa.ui.behavior; + +import android.content.Context; +import android.util.AttributeSet; +import android.view.View; + +import androidx.annotation.NonNull; +import androidx.coordinatorlayout.widget.CoordinatorLayout; + +import com.scwang.smartrefresh.layout.SmartRefreshLayout; + +import ceui.lisa.R; +import ceui.lisa.utils.Common; +import ceui.lisa.utils.DensityUtil; + +public class HeaderBehavior extends CoordinatorLayout.Behavior { + + private float visibleHeight = 0.0f; + private float allHeight = 0.0f; + private float deltaY = 0.0f; + + public HeaderBehavior() { + } + + public HeaderBehavior(Context context, AttributeSet attrs) { + super(context, attrs); + } + + @Override + public boolean onLayoutChild(@NonNull CoordinatorLayout parent, @NonNull View child, int layoutDirection) { + SmartRefreshLayout refreshLayout = parent.findViewById(R.id.refreshLayout); + int height = parent.findViewById(R.id.bottom_bar).getMeasuredHeight(); + visibleHeight = (float) height; + allHeight = (float) parent.findViewById(R.id.core_linear).getMeasuredHeight(); + + Common.showLog("onLayoutChild visibleHeight " + visibleHeight + " allHeight " + allHeight); + refreshLayout.setPadding( + 0, + 0, + 0, + height - DensityUtil.dp2px(16.0f)); + return super.onLayoutChild(parent, child, layoutDirection); + } + + @Override + public boolean layoutDependsOn(@NonNull CoordinatorLayout parent, @NonNull View child, @NonNull View dependency) { + return dependency.getId() == R.id.content_scroll_view; + } + + @Override + public boolean onDependentViewChanged(@NonNull CoordinatorLayout parent, @NonNull View child, @NonNull View dependency) { + Common.showLog("dependency.getTranslationY() " + dependency.getY()); + return true; + } +} diff --git a/app/src/main/java/ceui/lisa/ui/behavior/NestedContentScrollBehavior.java b/app/src/main/java/ceui/lisa/ui/behavior/NestedContentScrollBehavior.java new file mode 100644 index 000000000..a104ca492 --- /dev/null +++ b/app/src/main/java/ceui/lisa/ui/behavior/NestedContentScrollBehavior.java @@ -0,0 +1,82 @@ +package ceui.lisa.ui.behavior; + +import android.content.Context; +import android.util.AttributeSet; +import android.view.View; +import android.view.ViewGroup; +import android.view.ViewTreeObserver; + +import androidx.annotation.NonNull; +import androidx.coordinatorlayout.widget.CoordinatorLayout; +import androidx.core.view.ViewCompat; + +import ceui.lisa.R; +import ceui.lisa.utils.Common; +import ceui.lisa.utils.DensityUtil; + +public class NestedContentScrollBehavior extends CoordinatorLayout.Behavior { + + private float headerHeight; + private float toolbarHeight = DensityUtil.dp2px(96.0f); + + public NestedContentScrollBehavior() { + } + + public NestedContentScrollBehavior(Context context, AttributeSet attrs) { + super(context, attrs); + } + + @Override + public boolean onLayoutChild(@NonNull CoordinatorLayout parent, @NonNull View child, int layoutDirection) { + + // 首先让父布局按照标准方式解析 + parent.onLayoutChild(child, layoutDirection); + // 获取到 HeaderView 的高度 + headerHeight = parent.findViewById(R.id.imagesTitleBlockLayout).getMeasuredHeight(); + + + + + // 设置 top 从而排在 HeaderView的下面 + ViewCompat.offsetTopAndBottom(child, (int)headerHeight); + return true; // true 表示我们自己完成了解析 不要再自动解析了 + } + + @Override + public boolean onStartNestedScroll(@NonNull CoordinatorLayout coordinatorLayout, @NonNull View child, @NonNull View directTargetChild, @NonNull View target, int axes, int type) { + return (axes & ViewCompat.SCROLL_AXIS_VERTICAL) != 0; + } + + @Override + public void onNestedPreScroll(@NonNull CoordinatorLayout coordinatorLayout, @NonNull View child, + @NonNull View target, int dx, int dy, @NonNull int[] consumed, int type) { + super.onNestedPreScroll(coordinatorLayout, child, target, dx, dy, consumed, type); + + if (dy > 0) { // 只处理手指上滑 + float newTransY = child.getTranslationY() - dy; + Common.showLog("onNestedPreScroll " + child.getTranslationY() + child.getClass().getSimpleName()); + if (newTransY >= (-headerHeight + toolbarHeight)) { + // 完全消耗滑动距离后没有完全贴顶或刚好贴顶 + // 那么就声明消耗所有滑动距离,并上移 RecyclerView + consumed[1] = dy; // consumed[0/1] 分别用于声明消耗了x/y方向多少滑动距离 + child.setTranslationY(newTransY); + } else { + consumed[1] = (int)(headerHeight + child.getTranslationY() - toolbarHeight); + child.setTranslationY(-headerHeight + toolbarHeight); + } + } + } + + @Override + public void onNestedScroll(@NonNull CoordinatorLayout coordinatorLayout, @NonNull View child, @NonNull View target, int dxConsumed, int dyConsumed, int dxUnconsumed, int dyUnconsumed, int type, @NonNull int[] consumed) { + super.onNestedScroll(coordinatorLayout, child, target, dxConsumed, dyConsumed, dxUnconsumed, dyUnconsumed, type, consumed); + if (dyUnconsumed < 0) { // 只处理手指向下滑动的情况 + float newTransY = child.getTranslationY() - dyUnconsumed; + if (newTransY <= 0) { + child.setTranslationY(newTransY); + } else { + child.setTranslationY(0.0f); + } + } + } +} diff --git a/app/src/main/java/ceui/lisa/ui/behavior/NestedHeaderScrollBehavior.java b/app/src/main/java/ceui/lisa/ui/behavior/NestedHeaderScrollBehavior.java new file mode 100644 index 000000000..7c01dc852 --- /dev/null +++ b/app/src/main/java/ceui/lisa/ui/behavior/NestedHeaderScrollBehavior.java @@ -0,0 +1,65 @@ +package ceui.lisa.ui.behavior; + +import android.content.Context; +import android.util.AttributeSet; +import android.view.View; + +import androidx.annotation.NonNull; +import androidx.coordinatorlayout.widget.CoordinatorLayout; + +import ceui.lisa.R; +import ceui.lisa.utils.Common; +import ceui.lisa.utils.DensityUtil; + +public class NestedHeaderScrollBehavior extends CoordinatorLayout.Behavior { + + private View title, bottom; + private float toolbarHeight = 0.0f; + + public NestedHeaderScrollBehavior() { + } + + public NestedHeaderScrollBehavior(Context context, AttributeSet attrs) { + super(context, attrs); + toolbarHeight = DensityUtil.dp2px(96.0f); + } + + @Override + public boolean onLayoutChild(@NonNull CoordinatorLayout parent, @NonNull View child, int layoutDirection) { + boolean superResult = super.onLayoutChild(parent, child, layoutDirection); +// title = child.findViewById(R.id.title); +// bottom = child.findViewById(R.id.bottom); + return superResult; + } + + @Override + public boolean layoutDependsOn(@NonNull CoordinatorLayout parent, @NonNull View child, @NonNull View dependency) { + return dependency.getId() == R.id.recy_list; + } + + @Override + public boolean onDependentViewChanged(@NonNull CoordinatorLayout parent, @NonNull View child, @NonNull View dependency) { + child.setTranslationY(dependency.getTranslationY()); + +// float ty = Math.abs(dependency.getTranslationY()); +// +// float half = child.getHeight() * 0.5f; +// if (ty < half) { +// float alpha = Math.max(0.0f, 1 - ty / half); +// title.setAlpha(alpha); +// } +// +// +// float third = child.getHeight() * 0.33f; +// float all = child.getHeight() - third - toolbarHeight; +// float tempY = ty - third; +// if (ty < third) { +// bottom.setAlpha(0.0f); +// } else if (ty >= third && tempY < all) { +// float alpha = tempY / all; +// bottom.setAlpha(Math.min(1.0f, alpha)); +// } + + return true; + } +} diff --git a/app/src/main/java/ceui/lisa/ui/behavior/Scroll.java b/app/src/main/java/ceui/lisa/ui/behavior/Scroll.java new file mode 100644 index 000000000..ce3b8f48b --- /dev/null +++ b/app/src/main/java/ceui/lisa/ui/behavior/Scroll.java @@ -0,0 +1,33 @@ +package ceui.lisa.ui.behavior; + +import android.content.Context; +import android.util.AttributeSet; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.core.widget.NestedScrollView; + +import ceui.lisa.utils.DensityUtil; + +public class Scroll extends NestedScrollView { + + public Scroll(@NonNull Context context) { + super(context); + } + + public Scroll(@NonNull Context context, @Nullable AttributeSet attrs) { + super(context, attrs); + } + + public Scroll(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + super.onMeasure(widthMeasureSpec, heightMeasureSpec); + int measureWidth = MeasureSpec.getSize(widthMeasureSpec); + int measureHeight = MeasureSpec.getSize(heightMeasureSpec); + setMeasuredDimension(measureWidth, measureHeight - DensityUtil.dp2px(96.0f)); + } +} diff --git a/app/src/main/res/drawable/ic_baseline_data_usage_24.xml b/app/src/main/res/drawable/ic_baseline_data_usage_24.xml new file mode 100644 index 000000000..b8a1d9e82 --- /dev/null +++ b/app/src/main/res/drawable/ic_baseline_data_usage_24.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/drawable/ic_baseline_dns_24.xml b/app/src/main/res/drawable/ic_baseline_dns_24.xml new file mode 100644 index 000000000..b2677f761 --- /dev/null +++ b/app/src/main/res/drawable/ic_baseline_dns_24.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/drawable/ic_baseline_toys_24.xml b/app/src/main/res/drawable/ic_baseline_toys_24.xml new file mode 100644 index 000000000..9e20dd2b8 --- /dev/null +++ b/app/src/main/res/drawable/ic_baseline_toys_24.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/drawable/ic_chevron_right_black_20dp.xml b/app/src/main/res/drawable/ic_chevron_right_black_20dp.xml new file mode 100644 index 000000000..0df1682ca --- /dev/null +++ b/app/src/main/res/drawable/ic_chevron_right_black_20dp.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/drawable/ic_toys_black_24dp.xml b/app/src/main/res/drawable/ic_toys_black_24dp.xml index d56ddfcf2..3dd6d0c8f 100644 --- a/app/src/main/res/drawable/ic_toys_black_24dp.xml +++ b/app/src/main/res/drawable/ic_toys_black_24dp.xml @@ -1,6 +1,6 @@ - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_bh.xml b/app/src/main/res/layout/fragment_bh.xml new file mode 100644 index 000000000..49e45ff71 --- /dev/null +++ b/app/src/main/res/layout/fragment_bh.xml @@ -0,0 +1,201 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_slide.xml b/app/src/main/res/layout/fragment_illust.xml similarity index 100% rename from app/src/main/res/layout/fragment_slide.xml rename to app/src/main/res/layout/fragment_illust.xml diff --git a/app/src/main/res/layout/fragment_new_right.xml b/app/src/main/res/layout/fragment_new_right.xml new file mode 100644 index 000000000..551232a10 --- /dev/null +++ b/app/src/main/res/layout/fragment_new_right.xml @@ -0,0 +1,173 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/recy_user_event.xml b/app/src/main/res/layout/recy_user_event.xml index 196364a48..0666992f8 100644 --- a/app/src/main/res/layout/recy_user_event.xml +++ b/app/src/main/res/layout/recy_user_event.xml @@ -8,18 +8,11 @@ - - - @@ -29,36 +22,53 @@ android:layout_width="match_parent" android:layout_height="wrap_content"> + + + - - + android:layout_toEndOf="@+id/user_head" + android:ellipsize="end" + android:maxLines="1" + android:textSize="12sp"> + + + app:tint="#a1a1a1" /> - + + - - - -