Android实现界面内嵌多种卡片视图(ViewPager、RadioGroup)

Android实现界面内嵌多种卡片视图,具体内容如下

效果如图所示:

1.选择某个界面时,对应的第几个小圆点亮:

通过selector制造圆点和进行更改小圆点被选择和未被选择时的颜色:

<?xml version="1.0" encoding="utf-8"?><selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_checked="true"> <shape>  <solid android:color="@color/app_green_area" />  <corners android:radius="5dp" /> </shape> </item> <item android:state_checked="false"> <shape>  <solid android:color="#fff" />  <corners android:radius="5dp" />  <stroke android:width="0.2dp"  android:color="@color/app_line"/> </shape> </item></selector>

2.主界面布局:

<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:gravity="center" android:background="@color/app_gray_bg"> <TextView  android:layout_width="match_parent"  android:layout_height="wrap_content"  android:gravity="center"  android:textSize="25sp"  android:textColor="@color/colorPrimary"  android:text="health页面"/> <android.support.v4.view.ViewPager  android:id="@+id/view_pager"  android:layout_gravity="center"  android:overScrollMode="never"  android:layout_width="match_parent"  android:layout_height="wrap_content"/> </LinearLayout> <RadioGroup android:layout_alignParentBottom="true" android:layout_marginBottom="20dp" android:id="@+id/group" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="center" android:gravity="center" android:orientation="horizontal"> <RadioButton  android:layout_width="10dp"  android:layout_height="10dp"  android:layout_marginLeft="10dp"  android:background="@drawable/selector_point"  android:button="@null" /> <RadioButton  android:layout_width="10dp"  android:layout_height="10dp"  android:layout_marginLeft="10dp"  android:background="@drawable/selector_point"  android:button="@null" /> <RadioButton  android:layout_width="10dp"  android:layout_height="10dp"  android:layout_marginLeft="10dp"  android:background="@drawable/selector_point"  android:button="@null" /> </RadioGroup></RelativeLayout>

3.主界面内嵌的卡片视图布局:

<?xml version="1.0" encoding="utf-8"?><android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_margin="2dp" app:cardCornerRadius="8dp"> <LinearLayout android:id="@+id/chart_bar" android:adjustViewBounds="true" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <TextView  android:id="@+id/tv_title"  android:textColor="@color/app_black"  android:gravity="center"  android:textSize="30sp"  android:layout_width="match_parent"  android:layout_height="wrap_content" /> <LinearLayout  android:adjustViewBounds="true"  android:layout_width="match_parent"  android:layout_height="match_parent"  android:orientation="vertical">  <LinearLayout  android:id="@+id/layout_data1"  android:layout_width="match_parent"  android:layout_height="match_parent"  android:gravity="center"  android:visibility="visible"  android:orientation="vertical">  <TextView   android:text="layout_data1"   android:textSize="30sp"   android:textColor="@color/colorPrimary"   android:layout_width="wrap_content"   android:layout_height="wrap_content" />  </LinearLayout>  <LinearLayout  android:id="@+id/layout_data2"  android:layout_width="match_parent"  android:layout_height="match_parent"  android:gravity="center"  android:visibility="visible"  android:orientation="vertical">  <TextView   android:text="layout_data2"   android:textSize="30sp"   android:textColor="@color/colorPrimary"   android:layout_width="wrap_content"   android:layout_height="wrap_content" />  </LinearLayout>  <LinearLayout  android:id="@+id/layout_data3"  android:layout_width="match_parent"  android:layout_height="match_parent"  android:gravity="center"  android:visibility="visible"  android:orientation="vertical">  <TextView   android:text="layout_data3"   android:textSize="30sp"   android:textColor="@color/colorPrimary"   android:layout_width="wrap_content"   android:layout_height="wrap_content" />  </LinearLayout> </LinearLayout> </LinearLayout></android.support.v7.widget.CardView>

4.定义卡片之间切换的样式:

/** * 卡片之间切换的样式 */public class ZoomOutPageTransformer implements ViewPager.PageTransformer { public static final float MAX_SCALE = 0.9f; public static final float MIN_SCALE = 0.8f; @Override public void transformPage(View page, float position) { position = position < -1 ? -1 : position; position = position > 1 ? 1 : position; float tempScale = position < 0 ? 1 + position : 1 - position; float slope = (MAX_SCALE - MIN_SCALE) / 1; float scaleValue = MIN_SCALE + tempScale * slope; page.setScaleX(scaleValue); page.setScaleY(scaleValue); if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {  page.getParent().requestLayout(); } }}

5.定义用于加载卡片视图的layout控件,方便自定义宽高比例:

import android.content.Context;import android.content.res.TypedArray;import android.text.TextUtils;import android.util.AttributeSet;import android.view.View;import android.view.ViewGroup;/** * 用于加载卡片视图 */public class RatioLayout extends ViewGroup { private float heightWidthRatio = 0.325f; public RatioLayout(Context context) { this(context, null); } public RatioLayout(Context context, AttributeSet attrs) { super(context, attrs); final TypedArray a = context.obtainStyledAttributes(  attrs, R.styleable.RatioLayout); heightWidthRatio = getFloatFromString(a.getString(R.styleable.RatioLayout_height_width_ratio)); a.recycle(); } public void setHeightWidthRatio(String ratio) { heightWidthRatio = getFloatFromString(ratio); } public static float getFloatFromString(String src) { if (TextUtils.isEmpty(src)) {  return 0; } float result; try {  result = Float.parseFloat(src);  return result; } catch (Exception e) { } String[] strs = src.split("/"); if (strs.length == 2) {  try {  float molecular = Float.parseFloat(strs[0]);//分子  float denominator = Float.parseFloat(strs[1]);//分子  result = molecular / denominator;  } catch (Exception e) {  result = 0;  } } else {  result = 0; } return result; } protected void onLayout(boolean changed, int left, int top, int right, int bottom) { layoutChildren(left, top, right, bottom); } void layoutChildren(int left, int top, int right, int bottom) { final int count = getChildCount(); for (int i = 0; i < count; i++) {  final View child = getChildAt(i);  if (child.getVisibility() != GONE) {  final LayoutParams lp = child.getLayoutParams();  final int width = child.getMeasuredWidth();  final int height = child.getMeasuredHeight();  child.layout(0, 0, width, 0 + height);  } } } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); if (heightWidthRatio > 0) {  int width = getMeasuredWidth();  int height = (int) (width * heightWidthRatio);  setMeasuredDimension(width, height);  int count = getChildCount();  if (count >= 1) {  for (int i = 0; i < count; i++) {   View child = getChildAt(i);   child.measure(MeasureSpec.makeMeasureSpec(getMeasuredWidth(), MeasureSpec.EXACTLY), MeasureSpec.makeMeasureSpec(getMeasuredHeight(), MeasureSpec.EXACTLY));  }  } } }}

6.卡片布局对应的activity:

public class FrHealthChart extends Fragment { public static final String DATA = "_data"; @BindView(R.id.layout_data1) LinearLayout layoutData1; @BindView(R.id.layout_data2) LinearLayout layoutData2; @BindView(R.id.layout_data3) LinearLayout layoutData3; @BindView(R.id.tv_title) TextView tvTitle; @BindView(R.id.chart_bar) LinearLayout chartBar; private int position;//用于标识选择的是哪个layout public static Fragment getInstance(int position) { FrHealthChart frHealthChart = new FrHealthChart(); Bundle bundle = new Bundle(); bundle.putInt(DATA, position); frHealthChart.setArguments(bundle); return frHealthChart; } @Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { View view = inflater.from(getContext()).inflate(R.layout.fragment_health_chart, container, false); ButterKnife.bind(this, view); Bundle bundle = getArguments(); if (bundle != null) {  position = bundle.getInt(DATA);  initCard(); } //加载卡片视图,控制宽高比例 RatioLayout ratioLayout = new RatioLayout(getContext()); ratioLayout.addView(view); ratioLayout.setHeightWidthRatio("67/52"); return ratioLayout; } private void initCard() { switch (position) {  case 0://显示layoutData1  layoutData1.setVisibility(View.VISIBLE);  layoutData2.setVisibility(View.GONE);  layoutData3.setVisibility(View.GONE);  initData();  break;  case 1://显示layoutData2  layoutData1.setVisibility(View.GONE);  layoutData2.setVisibility(View.VISIBLE);  layoutData3.setVisibility(View.GONE);  initData();  break;  case 2://显示layoutData3  layoutData1.setVisibility(View.GONE);  layoutData2.setVisibility(View.GONE);  layoutData3.setVisibility(View.VISIBLE);  initData();  break; } } /** * 初始化数据 */ private void initData() { switch (position) {  case 0:  tvTitle.setText("卡片内容" + "layout_data1");  chartBar.setBackgroundColor(Color.parseColor("#6ddac6"));  break;  case 1:  tvTitle.setText("卡片内容" + "layout_data2");  chartBar.setBackgroundColor(getResources().getColor(R.color.app_green_area));  break;  case 2:  tvTitle.setText("卡片内容" + "layout_data3");  chartBar.setBackgroundColor(getResources().getColor(R.color.colorAccent));  break; } }}

7.主界面的activity代码:

public class FrHealth extends Fragment implements ViewPager.OnPageChangeListener { @BindView(R.id.view_pager) ViewPager viewPager; @BindView(R.id.group) RadioGroup group; @Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { View view = LayoutInflater.from(getContext()).inflate(R.layout.fragment_health, container, false); ButterKnife.bind(this, view); initView(); return view; } private void initView() { RadioButton childAt = (RadioButton) group.getChildAt(0); childAt.setChecked(true); viewPager.setPageTransformer(true, new ZoomOutPageTransformer());//设置卡片之间切换的样式 viewPager.setOffscreenPageLimit(3);//限定预加载的卡片个数 ViewGroup.LayoutParams layoutParams = viewPager.getLayoutParams();// layoutParams.height = AppUtil.dp2px(getContext(), 400); float scale = getContext().getResources().getDisplayMetrics().density; layoutParams.height = (int) (400 * scale + 0.5F);//计算高宽 layoutParams.width = (int) (layoutParams.height * 0.8); if (viewPager.getParent() instanceof ViewGroup) {  ViewGroup viewParent = ((ViewGroup) viewPager.getParent());  viewParent.setClipChildren(false);  viewPager.setClipChildren(false); } viewPager.addOnPageChangeListener(this); MyPagerAdapter myPagerAdapter = new MyPagerAdapter(getChildFragmentManager()); viewPager.setAdapter(myPagerAdapter); } @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { } @Override public void onPageSelected(int position) { //根据监听viewPager的PageChangeListener获得选择的是哪个卡片,并把其对应位序的小圆点设置为选定状态 RadioButton childAt = (RadioButton) group.getChildAt(position); childAt.setChecked(true); } @Override public void onPageScrollStateChanged(int state) { } class MyPagerAdapter extends FragmentPagerAdapter { HashMap<Integer, Fragment> map = new HashMap<>(); public MyPagerAdapter(FragmentManager fm) {  super(fm); } @Override public Fragment getItem(int position) {  FrHealthChart fragment = (FrHealthChart) map.get(position);  if (fragment == null) {  fragment = (FrHealthChart) FrHealthChart.getInstance(position);  map.put(position, fragment);  }  return fragment; } @Override public int getCount() {  return 3;//卡片个数 } }}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

呼唤你前往另一个地方,过上另一种生活。

Android实现界面内嵌多种卡片视图(ViewPager、RadioGroup)

相关文章:

你感兴趣的文章:

标签云: