利用自定义的 RecyclerView 实现相册的滑动功能

来源:互联网 发布:淘宝上的苹果官网吗 编辑:程序博客网 时间:2024/06/15 17:58
        利用自定义的功能实现和上次一样的功能(相册), 《 使用 HorizontalScrollView 实现水平滚动,并点击有相应的反应效果》http://blog.csdn.net/antimage08/article/details/50493233  这次的自定义解决了上次在第 9 张图片时不能显示的问题,并添加了一些额外的功能。
       关于 RecyclerView 前面的文章已有两篇相应的内容介绍:
《RecyclerView 的简单使用》http://blog.csdn.net/antimage08/article/details/50010923   
《利用 RecyclerView 实现垂直交错的网格》http://blog.csdn.net/antimage08/article/details/50199841

       效果如下:



       自定义 RecyclerView 相对简单,用适配器加载下排的小图片,点击图片后,ImageView (大图)作出相应的相应。这里需要点击事件,用接口来实现事件的回调。
       RecyclerView 这个类里面有个 OnScrollListener 监听器,从名字就可以看出它是 RecyclerView 滑动的监听器。这里也用接口进行事件的回调。
       由于要用到 RecyclerView 的 OnScrollListener 。所以还要从 SDK 的目录下把相应的 jar 包导入 libs 目录下。否则可能会报错(我的就报错了(在 build.gradle 中也进行了相应的配置))
 




布局文件 activity_main.xml (这里使用了固定屏幕下方的 RecyclerView 高度的办法。这样感觉比上一篇固定 ImageView 的方法好,因为由于手机的屏幕大小不一。可能会出现较差的效果):
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:paddingBottom="5dp"    android:paddingLeft="5dp"    android:paddingRight="5dp"    android:paddingTop="5dp"    android:orientation="vertical"    tools:context="com.crazy.recyclerviewtest.MainActivity">    <LinearLayout        android:layout_weight="1"        android:layout_width="match_parent"        android:layout_height="0dp">        <ImageView            android:id="@+id/imageView"            android:layout_width="match_parent"            android:layout_height="match_parent"            android:src="@drawable/bg_01"            android:scaleType="centerCrop" />    </LinearLayout>    <com.crazy.recyclerviewtest.MyRecyclerView        android:id="@+id/my_recycler"        android:layout_width="match_parent"        android:layout_height="120dp"        android:layout_gravity="bottom"        android:scrollbars="none">    </com.crazy.recyclerviewtest.MyRecyclerView ></LinearLayout>



item_image.xml :
<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="120dp"    android:layout_height="120dp"    android:background="@drawable/bg_border_two" >    <ImageView        android:id="@+id/bottom_image"        android:layout_width="80dp"        android:layout_height="80dp"        android:layout_margin="10dp"        android:stateListAnimator="@animator/image_click"        android:layout_alignParentTop="true"        android:layout_centerHorizontal="true"        android:src="@drawable/bg_02"        android:scaleType="centerCrop" />    <TextView        android:id="@+id/bottom_text_view"        android:layout_marginBottom="5dp"        android:text="没有文字呢"        android:layout_below="@id/bottom_image"        android:textSize="12sp"        android:layout_centerHorizontal="true"        android:textColor="#f0f"        android:layout_width="wrap_content"        android:layout_height="wrap_content" /></RelativeLayout>



MainActivity.java :
package com.crazy.recyclerviewtest;import android.app.Activity;import android.content.Context;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.os.Bundle;import android.support.v7.widget.LinearLayoutManager;import android.view.View;import android.widget.ImageView;import java.io.InputStream;import java.util.ArrayList;import java.util.Arrays;import java.util.List;public class MainActivity extends Activity {    private MyRecyclerView mRecyclerView;    private ImageView mImageView;    private MyAdapter myAdapter;    private List<Bitmap> bitmapList;    private List<String> mDatas;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        init();    }    private void init() {        bitmapList = new ArrayList<>(Arrays.asList(                readBitMap(this, R.drawable.bricks),                readBitMap(this, R.drawable.dog),                readBitMap(this, R.drawable.flower),                readBitMap(this, R.drawable.grass),                readBitMap(this, R.drawable.stones),                readBitMap(this, R.drawable.wood),                readBitMap(this, R.drawable.bg_01),                readBitMap(this, R.drawable.bg_02),                readBitMap(this, R.drawable.bg_03),                readBitMap(this, R.drawable.bg_04),                readBitMap(this, R.drawable.bg_05),                readBitMap(this, R.drawable.bg_06),                readBitMap(this, R.drawable.bg_07)        ));        mDatas = new ArrayList<>();        for (int i = 'A'; i <= 'M'; i++) {            mDatas.add("" + (char) i);        }        mImageView = (ImageView)findViewById(R.id.imageView);        mRecyclerView = (MyRecyclerView)findViewById(R.id.my_recycler);        LinearLayoutManager layoutManager = new LinearLayoutManager(this);        layoutManager.setOrientation(LinearLayoutManager.HORIZONTAL);        mRecyclerView.setLayoutManager(layoutManager);        myAdapter = new MyAdapter(this, bitmapList, mDatas);        mRecyclerView.setAdapter(myAdapter);        mRecyclerView.setOnItemScrollChangeListener(new MyRecyclerView.OnItemScrollListener() {            @Override            public void onItemChange(View view, int position) {                mImageView.setImageBitmap(bitmapList.get(position));            }        });        myAdapter.setOnItemClickListener(new MyAdapter.OnItemClickListener() {            @Override            public void onItemClick(View view, int position) {                mImageView.setImageBitmap(bitmapList.get(position));            }        });    }    public static Bitmap readBitMap(Context mContext, int resId) {        BitmapFactory.Options opt = new BitmapFactory.Options();        opt.inPreferredConfig = Bitmap.Config.RGB_565;        opt.inPurgeable = true;        opt.inInputShareable = true;        InputStream is = mContext.getResources().openRawResource(resId);        return BitmapFactory.decodeStream(is, null, opt);    }}




MyAdapter.java :
package com.crazy.recyclerviewtest;import android.content.Context;import android.graphics.Bitmap;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 java.util.ArrayList;import java.util.List;/** * Created by antimage on 2016/1/11. */public class MyAdapter extends RecyclerView.Adapter<MyAdapter.CrazyViewHolder> {    private List<Bitmap> bitmapList;    private LayoutInflater inflater;    private List<String> mDatas;    private OnItemClickListener mOnItemClickListener;    public interface OnItemClickListener {        void onItemClick(View view, int position);    }    public void setOnItemClickListener(OnItemClickListener mOnItemClickListener) {        this.mOnItemClickListener = mOnItemClickListener;    }    public MyAdapter(Context context, List<Bitmap> bitmapList, List<String> mDatas) {        inflater = LayoutInflater.from(context);        if (bitmapList == null || mDatas == null) {            bitmapList = new ArrayList<>();            mDatas = new ArrayList<>();        } else {            this.bitmapList = bitmapList;            this.mDatas = mDatas;        }    }    @Override    public CrazyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {        View view = inflater.inflate(R.layout.item_image, parent, false);        CrazyViewHolder cViewHolder = new CrazyViewHolder(view);        cViewHolder.smallImage = (ImageView) view.findViewById(R.id.bottom_image);        cViewHolder.textView = (TextView)view.findViewById(R.id.bottom_text_view);        return cViewHolder;    }    @Override    public void onBindViewHolder(final CrazyViewHolder holder, final int position) {        holder.smallImage.setImageBitmap(bitmapList.get(position));        holder.textView.setText(mDatas.get(position));        if (mOnItemClickListener != null) {            holder.itemView.setOnClickListener(new View.OnClickListener() {                @Override                public void onClick(View v) {                    mOnItemClickListener.onItemClick(holder.itemView, position);                }            });        }    }    @Override    public int getItemCount() {        return bitmapList.size();    }    public class CrazyViewHolder extends RecyclerView.ViewHolder {        ImageView smallImage;        TextView textView;        public CrazyViewHolder(View itemView) {            super(itemView);        }    }}




MyRecyclerView.java :
package com.crazy.recyclerviewtest;import android.content.Context;import android.support.v7.widget.RecyclerView;import android.support.v7.widget.RecyclerView.OnScrollListener;import android.util.AttributeSet;import android.view.View;public class MyRecyclerView extends RecyclerView implements OnScrollListener {/* 当前第一个View*/private View firstView;private OnItemScrollListener mOnItemScrollListener;public interface OnItemScrollListener {void onItemChange(View view, int position);}public void setOnItemScrollChangeListener(OnItemScrollListener mOnItemScrollListener) {this.mOnItemScrollListener = mOnItemScrollListener;}public MyRecyclerView(Context context, AttributeSet attrs) {super(context, attrs);// 滚动时,上面的 ImageView 也要发生变化,注册监听器this.setOnScrollListener(this);}@Overrideprotected void onLayout(boolean changed, int l, int t, int r, int b) {super.onLayout(changed, l, t, r, b);firstView = getChildAt(0);if (mOnItemScrollListener != null) {mOnItemScrollListener.onItemChange(firstView, getChildPosition(firstView));}}@Overridepublic void onScrollStateChanged(int arg0) {}@Overridepublic void onScrolled(int arg0, int arg1) {View newView = getChildAt(0);// 滚动时发生变化才回调if (mOnItemScrollListener != null) {if (newView != null && newView != firstView) {firstView = newView ;mOnItemScrollListener.onItemChange(firstView, getChildPosition(firstView));}}}}




点击图片产生相应效果的 XML :

bg_border.xml :
<?xml version="1.0" encoding="utf-8"?><shape xmlns:android="http://schemas.android.com/apk/res/android"    android:shape="rectangle">    <solid android:color="#0CC"/></shape>



bg_border_two.xml :
<?xml version="1.0" encoding="utf-8"?><selector xmlns:android="http://schemas.android.com/apk/res/android">        <item        android:drawable="@drawable/bg_border"        android:state_pressed="true"/>    <item android:drawable="@android:color/white" /></selector>



image_click.xml :
<?xml version="1.0" encoding="utf-8"?><selector xmlns:android="http://schemas.android.com/apk/res/android">    <item        android:state_enabled="true"        android:state_pressed="true">        <set android:ordering="together">            <objectAnimator                android:duration="@android:integer/config_shortAnimTime"                android:propertyName="scaleX"                android:valueTo="0.8"                android:valueType="floatType" />            <objectAnimator                android:duration="@android:integer/config_shortAnimTime"                android:propertyName="scaleY"                android:valueTo="0.8"                android:valueType="floatType" />        </set>    </item>    <item>        <set android:ordering="together">            <objectAnimator                android:duration="@android:integer/config_shortAnimTime"                android:propertyName="scaleX"                android:valueTo="1.0"                android:valueType="floatType" />            <objectAnimator                android:duration="@android:integer/config_shortAnimTime"                android:propertyName="scaleY"                android:valueTo="1.0"                android:valueType="floatType" />        </set>    </item></selector>


0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 将军,郡主又叒叕爬墙了! 残疾暴君的庶女妻 我在宗门种向日葵后拯救了修仙界 快穿:病娇男神又凶又粘人 戏精娘子总扮乖 我在系统圈中艰难生存 天道的疯批美人她靠算卦爆红 离婚后,偏执指挥官夜夜求关注 我靠无限物资全球基建 本道祖文成武德 全福夫人要和离 她从火光中来 裴先生每天都在撒娇求和 空间逃荒:团宠小尼姑路子野 别慌,学霸老爹和我一起穿越了 薄先生突然黏她上瘾 团宠崽崽是只桃花精 我那老板柔弱不能自理 反派小媳妇的逆袭指南 我有一个大佬群 二婚后,我在豪门扮柔弱 诸天仙神热搜:主神老婆竟是魔尊 团宠小福妻又娇又软 替嫁医妃有空间 重生之农门贵夫 野性偏爱 嫁给病弱太子后我躺赢了 咸鱼娘娘一心只想翻墙 救命!破产后高冷总裁处处招惹我 冷酷将军每天都想要贴贴 何以赎光 甜腻!病娇傅少竟然暗恋我! 天价萌妻:偏执帝少心尖宠 有读心术后,战神把娘子宠上天 穿书后,我刷错了反派的好感度 摄政王怀里的团宠美人娇又软 满级千金不想掉马 女帝她就是个卖药的! 华娱激荡年代 她来看我的演唱会 快穿:娇养反派大佬做替身