Commit 0a5e364b by 段启岩

搜索框组件完成

parent 35b557d8
package cn.yunliyunwai.beyondclouds.adapter;
import android.os.Bundle;
import androidx.annotation.NonNull;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentStatePagerAdapter;
import java.util.List;
import cn.yunliyunwai.beyondclouds.data.model.BlogCategory;
import cn.yunliyunwai.beyondclouds.ui.HomeFragment;
public class CategoryFragmentAdapter extends FragmentStatePagerAdapter {
private List<BlogCategory> categories;
public CategoryFragmentAdapter(@NonNull FragmentManager fm, List<BlogCategory> categories) {
super(fm, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT);
this.categories = categories;
}
@NonNull
@Override
public Fragment getItem(int position) {
HomeFragment.BlogListFragment fragment = HomeFragment.BlogListFragment.newInstance();
Bundle bundle = new Bundle();
bundle.putString("text", categories.get(position).getCategory());
fragment.setArguments(bundle);
return fragment;
}
@Override
public int getCount() {
return categories.size();
}
}
package cn.yunliyunwai.beyondclouds.adapter;
import android.content.Context;
import androidx.viewpager.widget.ViewPager;
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 java.util.List;
import cn.yunliyunwai.beyondclouds.R;
import cn.yunliyunwai.beyondclouds.data.model.BlogCategory;
import cn.yunliyunwai.beyondclouds.view.CommonPagerIndicator;
import cn.yunliyunwai.beyondclouds.view.ScaleTransitionPagerTitleView;
public class HomeNavigatorAdapter extends CommonNavigatorAdapter {
private List<BlogCategory> categories;
private ViewPager viewPager;
public HomeNavigatorAdapter(List<BlogCategory> categories, ViewPager viewPager) {
this.categories = categories;
this.viewPager = viewPager;
}
@Override
public int getCount() {
return categories.size();
}
@Override
public IPagerTitleView getTitleView(Context context, int index) {
ScaleTransitionPagerTitleView scaleTransitionPagerTitleView = ScaleTransitionPagerTitleView.createDefaultTitleView(context);
scaleTransitionPagerTitleView.setText(categories.get(index).getCategory());
scaleTransitionPagerTitleView.setOnClickListener(view -> viewPager.setCurrentItem(index));
return scaleTransitionPagerTitleView;
}
@Override
public IPagerIndicator getIndicator(Context context) {
CommonPagerIndicator indicator = new CommonPagerIndicator(context);
float density = context.getResources().getDisplayMetrics().density;
indicator.setIndicatorDrawable(context.getResources().getDrawable(R.drawable.tab_indicator));
indicator.setMode(CommonPagerIndicator.MODE_EXACTLY);
indicator.setDrawableHeight(2 * density);
indicator.setDrawableWidth(8 * density);
return indicator;
}
}
package cn.yunliyunwai.beyondclouds.ui;
import android.content.Context;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
......@@ -9,29 +8,19 @@ import android.view.ViewGroup;
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.lifecycle.ViewModelProvider;
import androidx.viewpager.widget.ViewPager;
import net.lucode.hackware.magicindicator.ViewPagerHelper;
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 java.util.List;
import javax.inject.Inject;
import cn.yunliyunwai.beyondclouds.BeyondApplication;
import cn.yunliyunwai.beyondclouds.R;
import cn.yunliyunwai.beyondclouds.adapter.CategoryFragmentAdapter;
import cn.yunliyunwai.beyondclouds.adapter.HomeNavigatorAdapter;
import cn.yunliyunwai.beyondclouds.base.BaseFragment;
import cn.yunliyunwai.beyondclouds.data.model.BlogCategory;
import cn.yunliyunwai.beyondclouds.databinding.FragmentCategoryBinding;
import cn.yunliyunwai.beyondclouds.databinding.FragmentHomeBinding;
import cn.yunliyunwai.beyondclouds.view.CommonPagerIndicator;
import cn.yunliyunwai.beyondclouds.view.ScaleTransitionPagerTitleView;
import cn.yunliyunwai.beyondclouds.viewmodel.HomeFragmentViewModel;
public class HomeFragment extends BaseFragment<HomeFragmentViewModel, FragmentHomeBinding> {
......@@ -74,75 +63,13 @@ public class HomeFragment extends BaseFragment<HomeFragmentViewModel, FragmentHo
}
static class HomeNavigatorAdapter extends CommonNavigatorAdapter {
private List<BlogCategory> categories;
private ViewPager viewPager;
public HomeNavigatorAdapter(List<BlogCategory> categories, ViewPager viewPager) {
this.categories = categories;
this.viewPager = viewPager;
}
@Override
public int getCount() {
return categories.size();
}
@Override
public IPagerTitleView getTitleView(Context context, int index) {
ScaleTransitionPagerTitleView scaleTransitionPagerTitleView = ScaleTransitionPagerTitleView.createDefaultTitleView(context);
scaleTransitionPagerTitleView.setText(categories.get(index).getCategory());
scaleTransitionPagerTitleView.setOnClickListener(view -> viewPager.setCurrentItem(index));
return scaleTransitionPagerTitleView;
}
@Override
public IPagerIndicator getIndicator(Context context) {
CommonPagerIndicator indicator = new CommonPagerIndicator(context);
indicator.setIndicatorDrawable(context.getResources().getDrawable(R.drawable.tab_indicator));
indicator.setMode(CommonPagerIndicator.MODE_EXACTLY);
indicator.setDrawableHeight(8);
indicator.setDrawableWidth(26);
indicator.setYOffset(2);
return indicator;
}
}
static class CategoryFragmentAdapter extends FragmentStatePagerAdapter {
private List<BlogCategory> categories;
public CategoryFragmentAdapter(@NonNull FragmentManager fm, List<BlogCategory> categories) {
super(fm, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT);
this.categories = categories;
}
@NonNull
@Override
public Fragment getItem(int position) {
CategoryFragment fragment = CategoryFragment.newInstance();
Bundle bundle = new Bundle();
bundle.putString("text", categories.get(position).getCategory());
fragment.setArguments(bundle);
return fragment;
}
@Override
public int getCount() {
return categories.size();
}
}
public static class CategoryFragment extends Fragment {
public static class BlogListFragment extends Fragment {
private FragmentCategoryBinding binding;
private String text;
static CategoryFragment newInstance() {
return new CategoryFragment();
public static BlogListFragment newInstance() {
return new BlogListFragment();
}
@Override
......
......@@ -5,6 +5,7 @@ import android.graphics.Typeface;
import net.lucode.hackware.magicindicator.buildins.commonnavigator.titles.ColorTransitionPagerTitleView;
import cn.yunliyunwai.beyondclouds.R;
import cn.yunliyunwai.beyondclouds.util.TypeFaces;
......@@ -17,7 +18,7 @@ public class ScaleTransitionPagerTitleView extends ColorTransitionPagerTitleView
@Override
public void onEnter(int index, int totalCount, float enterPercent, boolean leftToRight) {
super.onEnter(index, totalCount, enterPercent, leftToRight); // 实现颜色渐变
super.onEnter(index, totalCount, enterPercent, leftToRight);
setScaleX(mMinScale + (1.0f - mMinScale) * enterPercent);
setScaleY(mMinScale + (1.0f - mMinScale) * enterPercent);
setTypeface(TypeFaces.SOURCE_HAN_SANS_CN, Typeface.BOLD);
......@@ -25,9 +26,10 @@ public class ScaleTransitionPagerTitleView extends ColorTransitionPagerTitleView
@Override
public void onLeave(int index, int totalCount, float leavePercent, boolean leftToRight) {
super.onLeave(index, totalCount, leavePercent, leftToRight); // 实现颜色渐变
super.onLeave(index, totalCount, leavePercent, leftToRight);
setScaleX(1.0f + (mMinScale - 1.0f) * leavePercent);
setScaleY(1.0f + (mMinScale - 1.0f) * leavePercent);
setTypeface(TypeFaces.SOURCE_HAN_SANS_CN);
}
public float getMinScale() {
......@@ -39,12 +41,16 @@ public class ScaleTransitionPagerTitleView extends ColorTransitionPagerTitleView
}
public static ScaleTransitionPagerTitleView createDefaultTitleView(Context context) {
float density = context.getResources().getDisplayMetrics().density;
ScaleTransitionPagerTitleView scaleTransitionPagerTitleView = new ScaleTransitionPagerTitleView(context);
scaleTransitionPagerTitleView.setTextSize(16);
scaleTransitionPagerTitleView.setTextSize(18);
scaleTransitionPagerTitleView.setTypeface(TypeFaces.SOURCE_HAN_SANS_CN);
scaleTransitionPagerTitleView.setMinScale(0.85f);
scaleTransitionPagerTitleView.setNormalColor(0xff999999);
scaleTransitionPagerTitleView.setSelectedColor(0xff333333);
scaleTransitionPagerTitleView.setMinScale(0.8f);
int paddingTop = scaleTransitionPagerTitleView.getPaddingTop();
int paddingBottom = scaleTransitionPagerTitleView.getPaddingTop();
scaleTransitionPagerTitleView.setPadding((int) (12 * density), paddingTop, (int) (12 * density), paddingBottom);
scaleTransitionPagerTitleView.setNormalColor(context.getResources().getColor(R.color.colorText));
scaleTransitionPagerTitleView.setSelectedColor(context.getResources().getColor(R.color.colorTextAccent));
return scaleTransitionPagerTitleView;
}
}
\ No newline at end of file
package cn.yunliyunwai.beyondclouds.view;
import android.content.Context;
import android.os.Build;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.widget.FrameLayout;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.RequiresApi;
import cn.yunliyunwai.beyondclouds.R;
public class SearchBar extends FrameLayout {
public SearchBar(@NonNull Context context) {
super(context);
initView(context);
}
public SearchBar(@NonNull Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
initView(context);
}
public SearchBar(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
initView(context);
}
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
public SearchBar(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
initView(context);
}
public void initView(Context context) {
LayoutInflater.from(context).inflate(R.layout.beyond_search_bar, this);
}
}
......@@ -40,12 +40,7 @@ public class HomeFragmentViewModel extends ViewModel {
blogRepository.getCategories().observeForever(response -> {
if (response.getCode() == 0) {
homeCategories.setValue(response.getData());
appExecutors.diskIO().execute(new Runnable() {
@Override
public void run() {
blogRepository.saveCategories(response.getData());
}
});
appExecutors.diskIO().execute(() -> blogRepository.saveCategories(response.getData()));
}
});
}
......
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="40dp"
android:background="@color/colorWhite"
xmlns:app="http://schemas.android.com/apk/res-auto">
<View
android:id="@+id/search_bar_to_border"
android:layout_width="0dp"
android:layout_height="1dp"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
android:layout_marginStart="12dp"
android:layout_marginLeft="12dp"
android:layout_marginEnd="12dp"
android:layout_marginRight="12dp"
android:background="#efefef" />
<ImageView
android:id="@+id/search_icon_search"
app:layout_constraintTop_toTopOf="@id/search_bar_to_border"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
android:src="@color/colorPrimary"
android:layout_marginStart="20dp"
android:layout_marginLeft="20dp"
android:layout_width="16dp"
android:layout_height="16dp" />
<EditText
android:id="@+id/search_bar_edit_text"
android:paddingLeft="10dp"
android:background="@null"
android:hint="搜索话题/用户"
android:textSize="12sp"
android:textColor="#aaaaaa"
app:layout_constraintTop_toBottomOf="@id/search_bar_to_border"
app:layout_constraintStart_toEndOf="@id/search_icon_search"
app:layout_constraintEnd_toStartOf="@id/search_icon_add"
android:layout_width="0dp"
android:layout_height="39dp" />
<ImageView
android:id="@+id/search_icon_add"
app:layout_constraintTop_toTopOf="@id/search_bar_to_border"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
android:src="@color/colorPrimary"
android:layout_marginEnd="14dp"
android:layout_marginRight="14dp"
android:layout_width="16dp"
android:layout_height="16dp" />
</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
......@@ -19,15 +19,21 @@
app:layout_constraintEnd_toEndOf="parent"
android:layout_width="match_parent"
android:layout_height="50dp" />
<cn.yunliyunwai.beyondclouds.view.SearchBar
android:id="@+id/search_bar"
app:layout_constraintTop_toBottomOf="@id/magic_indicator"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<androidx.viewpager.widget.ViewPager
android:id="@+id/view_pager"
app:layout_constraintTop_toBottomOf="@id/magic_indicator"
app:layout_constraintTop_toBottomOf="@id/search_bar"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
android:layout_width="match_parent"
android:layout_height="0dp"
/>
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>
\ No newline at end of file
......@@ -6,4 +6,6 @@
<color name="colorBackground">#EDF5F8</color>
<color name="colorWhite">#FFFFFF</color>
<color name="colorStatusBar">#ffffff</color>
<color name="colorText">#999999</color>
<color name="colorTextAccent">#333333</color>
</resources>
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment