package com.zjw.mymaterialdesign5;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.NavigationView;
import android.support.design.widget.Snackbar;
import android.support.v4.view.GravityCompat;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.ActionBar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.Toolbar;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Toast;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import butterknife.BindView;
import butterknife.ButterKnife;
//12.5 p430 卡片式布局
//这一章从ToolBar开始应该都是连着的,只是我把它们都拆开来了,其余可参看前面笔记
//12.5.1 p431 CardView
/*
CardView其实也是一个FrameLayout,只是额外提供了圆角和阴影等效果
<android.support.v7.widget.CardView
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:cardCornerRadius="4dp"
app:elevation="5dp">
<TextView
android:id="@+id/info_text"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
</android.support.v7.widget.CardView>
其中 app:cardCornerRadius="4dp"属性指定卡片圆角的弧度,数值越大,弧度越大
app:elevation="5dp"属性指定卡片的高度,数值越大,高度越大,投影范围越大,投影效果越淡
*/
/*
1.依赖:
compile 'com.android.support:recyclerview-v7:25.3.1'
compile 'com.android.support:cardview-v7:25.3.1'
compile 'com.github.bumptech.glide:glide:3.7.0'
glide:图片加载库,可加载本地图片、网络图片、GIF图片,甚至本地视频
glide项目地址:https://github.com/bumptech/glide
2.Fruit实体:(String name;int imageId;)
3.recyclerView子项布局
<?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="wrap_content"
android:layout_margin="5dp"
app:cardCornerRadius="4dp"
>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<ImageView
android:id="@+id/fruit_image"
android:layout_width="match_parent"
android:layout_height="100dp"
android:scaleType="centerInside"
android:src="@drawable/apple_pic"/>
<TextView
android:id="@+id/fruit_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_margin="5dp"
android:text="尚未加载"
android:textSize="16sp"/>
</LinearLayout>
</android.support.v7.widget.CardView>
4.改主布局
scaleType属性:
center 按图片的原来size居中显示,当图片长/宽超过View的长/宽,则截取图片的居中部分显示
centerCrop 按比例扩大图片的size居中显示,使得图片长(宽)等于或大于View的长(宽)
centerInside 将图片的内容完整居中显示,通过按比例缩小或原来的size使得图片长/宽等于或小于View的长/宽
fitCenter 把图片按比例扩大/缩小到View的宽度,居中显示
fitEnd 把图片按比例扩大/缩小到View的宽度,显示在View的下部分位置
fitStart 把图片按比例扩大/缩小到View的宽度,显示在View的上部分位置
fitXY 把图片 不按比例扩大/缩小到View的大小显示
matrix 用矩阵来绘制,动态缩小放大图片来显示
5.recyclerView适配器
package com.zjw.mymaterialdesign5;
import android.content.Context;
import android.support.v7.widget.CardView;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import com.bumptech.glide.Glide;
import java.util.List;
public class FruitAdapter extends RecyclerView.Adapter<FruitAdapter.ViewHolder> {
private Context mContext;
private final List<Fruit> mFruitList;
static class ViewHolder extends RecyclerView.ViewHolder {
CardView cardView;
ImageView fruitImage;
TextView fruitName;
public ViewHolder(View itemView) {
super(itemView);
cardView = (CardView) itemView;
fruitImage = (ImageView) itemView.findViewById(R.id.fruit_image);
fruitName = (TextView) itemView.findViewById(R.id.fruit_name);
}
}
public FruitAdapter(List<Fruit> fruitList) {
this.mFruitList = fruitList;
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
if (mContext == null) {
mContext = parent.getContext();
}
View view = LayoutInflater.from(mContext).inflate(R.layout.fruit_item, parent, false);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
Fruit fruit = mFruitList.get(position);
//holder.fruitImage.setImageResource(fruit.getImageId());
Glide.with(mContext).load(fruit.getImageId()).into(holder.fruitImage);
holder.fruitName.setText(fruit.getName());
}
@Override
public int getItemCount() {
return mFruitList.size();
}
}
6.改主代码
*/
//此时RecyclerView会遮挡Toolbar
//12.5.2 p437 AppBarLayout
/*
遮挡原因:
CoordinateLayout是加强版FrameLayout,Toolbar与RecyclerView都在里面
不明确定位,默认在左上角,产生遮挡
解决方法一:向下偏移一个Toolbar高度
解决办法二:使用AppBarLayout
*/
/*
AppBarLayout:Design Support库
AppBarLayout实际上是一个垂直方向的LinearLayout,内部做了滚动事件封装,应用了Material Design设计理念
使用:
1.将Toolbar放入AppBarLayout
2.给RecyclerView指定一个布局行为
*/
/*
修改主布局代码:
有变动部分:
<android.support.design.widget.AppBarLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<android.support.v7.widget.Toolbar
android:id="@+id/tb"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="?attr/colorPrimary"
android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
app:popupTheme="@style/ThemeOverlay.AppCompat.Light">
</android.support.v7.widget.Toolbar>
</android.support.design.widget.AppBarLayout>
<android.support.v7.widget.RecyclerView
android:id="@+id/recycler_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior">
</android.support.v7.widget.RecyclerView>
其中app:layout_behavior="@string/appbar_scrolling_view_behavior"字符串由Design Support库提供,指定一个行为
*/
/*
关于行为behavior
可参考博客:http://www.cnblogs.com/android-blogs/p/5867398.html
*/
/*
当RecyclerView 滚动时通知了AppBarLayout
AppBarLayout内部子控件可以可以指定如何去影响这些事件
通过:app:layout_scrollFlags属性
改动主布局代码:
<android.support.v7.widget.Toolbar
android:id="@+id/tb"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="?attr/colorPrimary"
android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
app:layout_scrollFlags="scroll|enterAlways|snap">
</android.support.v7.widget.Toolbar>
其中app:layout_scrollFlags="scroll|enterAlways|snap",
scroll表示当RecyclerView向上滚动时,Toolbar会跟着一起向上滚动并实现隐藏
enterAlways表示当RecyclerView向下滚动时,Toolbar会跟着一起向下滚动并重新显示
snap表示当Toolbar还没有完全隐藏或显示的时候,会根据当前滚动的距离,自动选择是隐藏还是显示
*/
public class UseOfCardView extends AppCompatActivity {
@BindView(R.id.tb)
Toolbar mTb;
@BindView(R.id.navigation)
NavigationView mNavigation;
@BindView(R.id.dl)
DrawerLayout mDl;
@BindView(R.id.acb)
FloatingActionButton mAcb;
@BindView(R.id.recycler_view)
RecyclerView mRecyclerView;
//准备数据
private String[] arr = {"apple", "banana", "orange", "watermelon",
"pear", "grape", "pineapple", "strawberry", "cherry"
, "mango", "apple", "banana", "orange", "watermelon",
"pear", "grape", "pineapple", "strawberry", "cherry"
, "mango"};
private int[] arrId = {R.drawable.apple_pic, R.drawable.banana_pic, R.drawable.orange_pic, R.drawable.watermelon_pic,
R.drawable.pear_pic, R.drawable.grape_pic, R.drawable.pineapple_pic, R.drawable.strawberry_pic, R.drawable.cherry_pic,
R.drawable.mangp_pic, R.drawable.apple_pic, R.drawable.banana_pic, R.drawable.orange_pic, R.drawable.watermelon_pic,
R.drawable.pear_pic, R.drawable.grape_pic, R.drawable.pineapple_pic, R.drawable.strawberry_pic, R.drawable.cherry_pic,
R.drawable.mangp_pic};
private List<Fruit> fruitList = new ArrayList<Fruit>();
private FruitAdapter mFruitAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_use_of_card_view);
ButterKnife.bind(this);
setSupportActionBar(mTb);//设置标题栏
ActionBar actionBar = getSupportActionBar();//获取标题栏
if (actionBar != null) {
actionBar.setDisplayHomeAsUpEnabled(true);//显示HomeAsUp按钮
actionBar.setHomeAsUpIndicator(R.mipmap.ic_drawer);//设置HomeAsUp按钮图标
}
//设置DrawerLayout的菜单布局Navigation
mNavigation.setCheckedItem(R.id.holder);//设置默认选中项
mNavigation.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
mDl.closeDrawers();
return true;
}
});
//给FloatingActionButton设置点击事件
mAcb.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Snackbar.make(v, "you clicked floatingActionBar", Snackbar.LENGTH_SHORT)
.setAction("showtoast", new View.OnClickListener() {
@Override
public void onClick(View v) {
showToast("you clicked ...");
}
})
.show();
}
});
//初始化水果数据
initFruitData();
//给recyclerView设置布局样式和适配器
GridLayoutManager gridLayoutManager = new GridLayoutManager(this, 2);
mRecyclerView.setLayoutManager(gridLayoutManager);
mFruitAdapter = new FruitAdapter(fruitList);
mRecyclerView.setAdapter(mFruitAdapter);
}
//toolbar的menu
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.toolbar_menu, menu);
return true;
}
//toolbar上各个按钮点击事件
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.up:
showToast("you clicked up");
break;
case R.id.delete:
showToast("you clicked delete");
break;
case R.id.add:
showToast("you clicked add");
break;
case android.R.id.home:
mDl.openDrawer(GravityCompat.START);
break;
default:
break;
}
return true;
}
//弹吐司
private Toast mToast;
public void showToast(String msg) {
if (mToast == null) {
mToast = Toast.makeText(this, "", Toast.LENGTH_SHORT);
}
mToast.setText(msg);
mToast.show();
}
//初始化水果数据
private void initFruitData() {
fruitList.clear();
for (int i = 0; i <50; i++) {
Random random=new Random();
int index=random.nextInt( arr.length);
Fruit fruit = new Fruit(arr[index], arrId[index]);
fruitList.add(fruit);
}
}
}
转载于:https://my.oschina.net/u/3620480/blog/1499666
本文详细讲解了在Android开发中如何使用Material Design的CardView组件进行卡片式布局设计,包括圆角和阴影效果的配置。同时,介绍了如何利用RecyclerView展示动态卡片列表,并结合AppBarLayout和CoordinatorLayout实现流畅的滚动效果,确保Toolbar在滚动时的正确显示与隐藏。
1099

被折叠的 条评论
为什么被折叠?



