jar
compile'com.android.support:recyclerview-v7:26+'
compile'com.github.bumptech.glide:glide:3.7.0'
权限
<uses-permission android:name="android:permissiont.INTERNET"/>
代码
1.自定义控件
importandroid.content.Context;
importandroid.os.Handler;
importandroid.os.Message;
importandroid.support.annotation.Nullable;
importandroid.support.v7.widget.LinearLayoutManager;
importandroid.support.v7.widget.LinearSnapHelper;
importandroid.support.v7.widget.RecyclerView;
importandroid.util.AttributeSet;
importandroid.view.MotionEvent;
importandroid.view.View;
importjava.util.Timer;
importjava.util.TimerTask;
/**
* Created by 周岩 on 17/8/24.
*/
public class BannerRecyclerView extends RecyclerView {
private static final intSCROLL=1;
private intstartX;
private intstartY;
privateHandlermHandler=newHandler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch(msg.what) {
caseSCROLL:
smoothScrollToPosition(++mCurrentPosition);
break;
}
}
};
private booleanisTouching=false;
private booleanisPlaying=false;
private intmPeriod=3500;
private TimermTimer;
private TimerTaskmTimerTask;
private RunnablemPlayTask=newRunnable() {
@Override
public voidrun() {
if(!isTouching) {
mHandler.sendEmptyMessage(SCROLL);
mHandler.postDelayed(this,mPeriod);
}
}
};;
public int getCurrentPosition() {
return mCurrentPosition;
}
public void setCurrentPosition(intcurrentPosition) {
mCurrentPosition= currentPosition;
}
private intmCurrentPosition;
public BannerRecyclerView(Context context) {
super(context);
}
public BannerRecyclerView(Context context,@NullableAttributeSet attrs) {
super(context, attrs);
newPagerSnapHelper().attachToRecyclerView(this);
addOnScrollListener(newOnScrollListener() {
@Override
public voidonScrollStateChanged(RecyclerView recyclerView,intnewState) {
super.onScrollStateChanged(recyclerView, newState);
switch(newState) {
caseRecyclerView.SCROLL_STATE_IDLE:
int firstVisibleItemPosition = ((LinearLayoutManager) recyclerView.getLayoutManager()).findFirstVisibleItemPosition();
int lastVisibleItemPosition = ((LinearLayoutManager) recyclerView.getLayoutManager()).findLastVisibleItemPosition();
if(lastVisibleItemPosition-firstVisibleItemPosition==2&&mCurrentPosition!=firstVisibleItemPosition+1){
mCurrentPosition=firstVisibleItemPosition+1;
}
break;
// case RecyclerView.SCROLL_STATE_DRAGGING:
// System.out.println("SCROLL_STATE_DRAGGING"+mLinearLayoutManager.findFirstVisibleItemPosition()+"");
// System.out.println("SCROLL_STATE_DRAGGING"+mLinearLayoutManager.findLastVisibleItemPosition()+"");
// break;
// case RecyclerView.SCROLL_STATE_SETTLING:
// System.out.println(mLinearLayoutManager.findFirstVisibleItemPosition()+"");
// System.out.println(mLinearLayoutManager.findLastVisibleItemPosition()+"");
// break;
}
}
});
}
public BannerRecyclerView(Context context,@NullableAttributeSet attrs,intdefStyle) {
this(context, attrs);
}
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
switch(ev.getAction()) {
caseMotionEvent.ACTION_DOWN:
isTouching=true;
startX= (int)ev.getX();
startY= (int)ev.getY();
getParent().requestDisallowInterceptTouchEvent(true);
mHandler.removeCallbacksAndMessages(null);
break;
caseMotionEvent.ACTION_MOVE:
intmoveX = (int) ev.getX();
intmoveY = (int) ev.getY();
intdisX = moveX -startX;
intdisY = moveY -startY;
booleanisHorizontalMove = Math.abs(disX) *1.5> Math.abs(disY);
getParent().requestDisallowInterceptTouchEvent(isHorizontalMove);
break;
caseMotionEvent.ACTION_CANCEL:
caseMotionEvent.ACTION_UP:
isTouching=false;
resetAutoScroll();
break;
}
return super.dispatchTouchEvent(ev);
}
private class PagerSnapHelperextendsLinearSnapHelper {
@Override
public intfindTargetSnapPosition(LayoutManager layoutManager,intvelocityX,intvelocityY) {
inttargetPos =super.findTargetSnapPosition(layoutManager, velocityX, velocityY);
finalView currentView = findSnapView(layoutManager);
if(targetPos != RecyclerView.NO_POSITION&& currentView !=null) {
intcurrentPos = layoutManager.getPosition(currentView);
intfirst = ((LinearLayoutManager) layoutManager).findFirstVisibleItemPosition();
intlast = ((LinearLayoutManager) layoutManager).findLastVisibleItemPosition();
currentPos = targetPos < currentPos ? last : (targetPos > currentPos ? first : currentPos);
targetPos = targetPos < currentPos ? currentPos -1: (targetPos > currentPos ? currentPos +1: currentPos);
}
returntargetPos;
}
}
public void startAutoScroll() {
mHandler.postDelayed(mPlayTask,100);
}
public void resetAutoScroll(){
mHandler.postDelayed(mPlayTask,mPeriod);
}
}
2自定义控件引入布局文件中
activity_main
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:background="#f2f2f2">
<com.example.mac.binnerdemo.view.BannerRecyclerView
android:id="@+id/brv_show"
android:visibility="visible"
android:layout_width="match_parent"
android:layout_height="180dp"
android:background="@color/white"/>
</LinearLayout>
item_rv
<RelativeLayout android:layout_width="match_parent"
android:layout_height="@dimen/dimen_180">
<ImageView android:id="@+id/iv_item_home"
android:scaleType="centerCrop"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</RelativeLayout>
3 代码
(1)工具类
importandroid.app.Activity;
importandroid.util.Log;
importandroid.widget.ImageView;
importcom.bumptech.glide.Glide;
importcom.example.mac.binnerdemo.R;
/**
*@author zhouyan
*/
public class GlideManager {
/**
* 渐显动画时间 ms
*/
private static final intduration=300;
private static final intplaceholder= R.drawable.img_index_top;//占位图
private static final intheader_placeholder= R.drawable.img_index_top;//圆形头像占位图
private static final interror=0;//加载失败图R.drawable.ls_logo
/**
* 加载网络图片
*
*@paramcontext
*@paramurl
*@paramiv
*/
public static void setNormalImage(Activity context, String url, ImageView iv) {
if(context !=null)
Glide.with(context.getApplicationContext())
.load(url)
.placeholder(placeholder)//加载之前的 默认占位图
.error(error)//图片无法加载时的 默认占位图
.crossFade(duration)//淡入淡出动画 默认300ms
.centerCrop()
.into(iv);
}
/**
* 加载本地图片
*
*@paramcontext
*@paramresId
*@paramiv
*/
public static void setNormalImage(Activity context,intresId, ImageView iv) {
if(context !=null)
Glide.with(context.getApplicationContext())
.load(resId)
.placeholder(placeholder)//加载之前的 默认占位图
.error(error)//图片无法加载时的 默认占位图
.crossFade(duration)//淡入淡出动画 默认300ms
.centerCrop()
.into(iv);
}
}
(2)activity 代码
importandroid.app.Activity;
importandroid.support.v7.app.AppCompatActivity;
importandroid.os.Bundle;
importandroid.support.v7.widget.LinearLayoutManager;
importandroid.support.v7.widget.RecyclerView;
importandroid.view.LayoutInflater;
importandroid.view.View;
importandroid.view.ViewGroup;
importandroid.widget.ImageView;
importcom.example.mac.binnerdemo.glide.GlideManager;
importcom.example.mac.binnerdemo.view.BannerRecyclerView;
importjava.util.ArrayList;
public class MainActivity extends AppCompatActivity {
private BannerRecyclerView mBannerRecyclerView;
private ArrayList<String> imageUrls;
private RecyclerView.Adapter mRVAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mBannerRecyclerView= (BannerRecyclerView) findViewById(R.id.brv_show);
imageUrls=newArrayList<String>();
imageUrls.add("http://img.taodiantong.cn/v55183/infoimg/2013-07/130720115322ky.jpg");
imageUrls.add("http://pic30.nipic.com/20130626/8174275_085522448172_2.jpg");
imageUrls.add("http://pic18.nipic.com/20111215/577405_080531548148_2.jpg");
imageUrls.add("http://pic15.nipic.com/20110722/2912365_092519919000_2.jpg");
imageUrls.add("http://pic.58pic.com/58pic/12/64/27/55U58PICrdX.jpg");
LinearLayoutManager mLinearLayoutManager =newLinearLayoutManager(this, LinearLayoutManager.HORIZONTAL,false);
mBannerRecyclerView.setLayoutManager(mLinearLayoutManager);
view(imageUrls,this);
}
private voidview(final ArrayList mBannerinfosBeanList,final Activity context) {
if(mBannerRecyclerView.getAdapter() ==null) {
mRVAdapter=newRecyclerView.Adapter() {
@Override
publicViewHolderRV onCreateViewHolder(ViewGroup parent,int viewType) {
ViewHolderRV holderRV =new ViewHolderRV(LayoutInflater.from(context).inflate(R.layout.item_rv, parent,false));
return holderRV;
}
@Override
public void onBindViewHolder(ViewHolderRV holder,int position) {
if(holder!=null){
if(mBannerinfosBeanList!=null&&mBannerinfosBeanList.size() !=0) {
position = position %mBannerinfosBeanList.size();
//"?width=400&height=220"能过减小图片大小
GlideManager.setNormalImage(context,mBannerinfosBeanList.get(position)+"?width=400&height=220", holder.mIv);
}else{
GlideManager.setNormalImage(context, R.drawable.img_index_top, holder.mIv);
}
}
}
@Override
public int getItemCount() {
returnInteger.MAX_VALUE>>2;
}
};
mBannerRecyclerView.setAdapter(mRVAdapter);
mBannerRecyclerView.setCurrentPosition(200* mBannerinfosBeanList.size() -1);
mBannerRecyclerView.scrollToPosition(mBannerRecyclerView.getCurrentPosition());
if(mBannerinfosBeanList.size()!=1)mBannerRecyclerView.startAutoScroll();
}
}
//适配器
private class ViewHolderRV extends RecyclerView.ViewHolder {
public ImageView mIv;
publicViewHolderRV(View itemView) {
super(itemView);
mIv= (ImageView) itemView.findViewById(R.id.iv_item_home);
}
}
}
网友评论