Android使用自定义控件实现加载本地图片无限轮播
来源:互联网 发布:淘宝做什么类目比较好 编辑:程序博客网 时间:2024/06/16 18:11
实现效果如下:
不说那么多,直接上代码:
MainActivity
import android.os.Bundle;import android.support.v7.app.AppCompatActivity;import android.view.View;import android.widget.ImageView;import android.widget.Toast;import java.util.ArrayList;import java.util.List;public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ImageCycleView mImageCycleView = (ImageCycleView) findViewById(R.id.icv_topView);//mImageCycleView.setAutoCycle(false); //关闭自动播放//mImageCycleView.setCycleDelayed(2000);//设置自动轮播循环时间////mImageCycleView.setIndicationStyle(ImageCycleView.IndicationStyle.COLOR,//Color.BLUE, Color.RED, 1f);//mImageCycleView.setIndicationStyle(ImageCycleView.IndicationStyle.IMAGE,//R.drawable.dian_unfocus, R.drawable.dian_focus, 1f);//Log.e("eee", Environment.getExternalStorageDirectory().getPath()+ File.separator+"a1.jpg"); List<ImageCycleView.ImageInfo> list=new ArrayList<ImageCycleView.ImageInfo>(); //res图片资源 list.add(new ImageCycleView.ImageInfo(R.drawable.a1,"111111111111","")); list.add(new ImageCycleView.ImageInfo(R.drawable.a2,"222222222222222","")); list.add(new ImageCycleView.ImageInfo(R.drawable.a3,"3333333333333","")); //SD卡图片资源//list.add(new ImageCycleView.ImageInfo(new File(Environment.getExternalStorageDirectory(),"a1.jpg"),"11111",""));//list.add(new ImageCycleView.ImageInfo(new File(Environment.getExternalStorageDirectory(),"a2.jpg"),"22222",""));//list.add(new ImageCycleView.ImageInfo(new File(Environment.getExternalStorageDirectory(),"a3.jpg"),"33333","")); //使用网络加载图片//list.add(new ImageCycleView.ImageInfo("http://img.lakalaec.com/ad/57ab6dc2-43f2-4087-81e2-b5ab5681642d.jpg","11","eeee"));//list.add(new ImageCycleView.ImageInfo("http://img.lakalaec.com/ad/cb56a1a6-6c33-41e4-9c3c-363f4ec6b728.jpg","222","rrrr"));//list.add(new ImageCycleView.ImageInfo("http://img.lakalaec.com/ad/e4229e25-3906-4049-9fe8-e2b52a98f6d1.jpg", "333", "tttt")); mImageCycleView.setOnPageClickListener(new ImageCycleView.OnPageClickListener() { @Override public void onClick(View imageView, ImageCycleView.ImageInfo imageInfo) { Toast.makeText(MainActivity.this, "你点击了" + imageInfo.value.toString(), Toast.LENGTH_SHORT).show(); } }); mImageCycleView.loadData(list, new ImageCycleView.LoadImageCallBack() { @Override public ImageView loadAndDisplay(ImageCycleView.ImageInfo imageInfo) { //本地图片 ImageView imageView=new ImageView(MainActivity.this); imageView.setImageResource(Integer.parseInt(imageInfo.image.toString())); return imageView;////使用SD卡图片//SmartImageView smartImageView=new SmartImageView(MainActivity.this);//smartImageView.setImageURI(Uri.fromFile((File)imageInfo.image));//return smartImageView;////使用SmartImageView,既可以使用网络图片也可以使用本地资源//SmartImageView smartImageView=new SmartImageView(MainActivity.this);//smartImageView.setImageResource(Integer.parseInt(imageInfo.image.toString()));//return smartImageView; //使用BitmapUtils,只能使用网络图片//BitmapUtils bitmapUtils = new BitmapUtils(MainActivity.this);//ImageView imageView = new ImageView(MainActivity.this);//bitmapUtils.display(imageView, imageInfo.image.toString());//return imageView; } }); }}
ImageCycleView
import android.content.Context;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.os.Handler;import android.os.Message;import android.support.v4.view.PagerAdapter;import android.support.v4.view.ViewPager;import android.text.TextUtils;import android.util.AttributeSet;import android.view.MotionEvent;import android.view.View;import android.view.ViewGroup;import android.widget.FrameLayout;import android.widget.ImageView;import android.widget.LinearLayout;import android.widget.TextView;import java.util.ArrayList;import java.util.List;public class ImageCycleView extends FrameLayout { //上下文 private Context mContext; //图片轮播视图 private ImageCycleViewPager mViewPager; //数据集合 private List<ImageInfo> data = new ArrayList<ImageInfo>(); //加载图片回调函数 private LoadImageCallBack mLoadImageCallBack; //图片轮播指示器 private LinearLayout mIndicationGroup; //轮播的总数 private int mCount = 0; //未获得焦点 private Bitmap unFocusIndicationStyle; //获得焦点 private Bitmap focusIndicationStyle; //指示器间距,默认间距为指示器高度的1/2 private float indication_self_margin_percent = 0.5f; //单击监听事件 private OnPageClickListener mOnPageClickListener; //图片文本提示 private TextView mText; public ImageCycleView(Context context) { super(context); init(context); } public ImageCycleView(Context context, AttributeSet attrs) { super(context, attrs); init(context); } //初始化基础信息 private void init(Context context) { mContext = context; unFocusIndicationStyle = drawCircle(50, Color.GRAY); focusIndicationStyle = drawCircle(50, Color.WHITE); initView(); } //初始化View控件 private void initView() { View.inflate(mContext, R.layout.view_image_cycle, this); FrameLayout fl_image_cycle = (FrameLayout) findViewById(R.id.fl_image_cycle); mViewPager = new ImageCycleViewPager(mContext); mViewPager.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)); fl_image_cycle.addView(mViewPager); mViewPager.setOnPageChangeListener(new ImageCyclePageChangeListener()); mIndicationGroup = (LinearLayout) findViewById(R.id.ll_indication_group); mText = (TextView) findViewById(R.id.tv_text); } public enum IndicationStyle { COLOR, IMAGE } //设置轮播指示器样式 public void setIndicationStyle(IndicationStyle indicationStyle, int unFocus, int focus, float indication_self_percent) { if (indicationStyle == IndicationStyle.COLOR) { unFocusIndicationStyle = drawCircle(50, unFocus); focusIndicationStyle = drawCircle(50, focus); } else if (indicationStyle == IndicationStyle.IMAGE) { unFocusIndicationStyle = BitmapFactory.decodeResource(mContext.getResources(), unFocus); focusIndicationStyle = BitmapFactory.decodeResource(mContext.getResources(), focus); } indication_self_margin_percent = indication_self_percent; initIndication(); } //图片轮播是自动滚动状态 true 自动滚动,false 图片不能自动滚动只能手动左右滑动 private boolean isAutoCycle = true; //自动轮播间隔时间 private long mCycleDelayed = 3000; //设置是否自动轮播 public void setCycleDelayed(long delayed) { mCycleDelayed = delayed; } //设置是否自动无限轮播 public void setAutoCycle(Boolean state) { isAutoCycle = state; } //加载显示的数据 网络图片资源及标题 public void loadData(List<ImageInfo> list, LoadImageCallBack callBack) { data = list; mCount = list.size(); initIndication(); if (callBack == null) { new IllegalArgumentException("LoadImageCallBack 回调函数不能为空!"); } mLoadImageCallBack = callBack; mViewPager.setAdapter(new ImageCycleAdapter()); //最大值中间的第一个 mViewPager.setCurrentItem(Integer.MAX_VALUE / 2 - ((Integer.MAX_VALUE / 2) % mCount)); } //设置点击事件监听回调函数 public void setOnPageClickListener(OnPageClickListener listener) { mOnPageClickListener = listener; } //轮播控件的监听事件 public interface OnPageClickListener { //单击图片事件 void onClick(View imageView, ImageInfo imageInfo); } //初始化指示器 private void initIndication() { mIndicationGroup.removeAllViews(); for (int i = 0; i < mCount; i++) { ImageView imageView = new ImageView(mContext); LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(mIndicationGroup.getLayoutParams().height, LinearLayout.LayoutParams.MATCH_PARENT); params.leftMargin = (int) (mIndicationGroup.getLayoutParams().height * indication_self_margin_percent); imageView.setScaleType(ImageView.ScaleType.FIT_XY); imageView.setLayoutParams(params); if (i == 0) { imageView.setImageBitmap(focusIndicationStyle); } else { imageView.setImageBitmap(unFocusIndicationStyle); } mIndicationGroup.addView(imageView); } } private Bitmap drawCircle(int radius, int color) { Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG); paint.setColor(color);// 设置颜色 Bitmap bitmap = Bitmap.createBitmap(radius, radius, Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(bitmap); canvas.drawCircle(radius / 2, radius / 2, radius / 2, paint); return bitmap; } public static class ImageInfo { public ImageInfo(Object image, String text, Object value) { this.image = image; this.text = text; this.value = value; } public Object image; public String text = ""; public Object value; } //加载图片并显示回调接口 public interface LoadImageCallBack { ImageView loadAndDisplay(ImageInfo imageInfo); } //轮播图片监听 private final class ImageCyclePageChangeListener implements ViewPager.OnPageChangeListener { //上次指示器指示的位置,开始为默认位置0 private int preIndex = 0; @Override public void onPageSelected(int index) { index = index % mCount; //更新文本信息 String text = data.get(index).text; mText.setText(TextUtils.isEmpty(text) ? "" : text); //恢复默认没有获得焦点指示器样式 ((ImageView) (mIndicationGroup.getChildAt(preIndex))).setImageBitmap(unFocusIndicationStyle); // 设置当前显示图片的指示器样式 ((ImageView) (mIndicationGroup.getChildAt(index))).setImageBitmap(focusIndicationStyle); preIndex = index; } @Override public void onPageScrollStateChanged(int state) { } @Override public void onPageScrolled(int i, float v, int i1) { } } //图片轮播适配器 private class ImageCycleAdapter extends PagerAdapter { @Override public Object instantiateItem(ViewGroup container, final int position) { final ImageInfo imageInfo = data.get(position % mCount); ImageView imageView = mLoadImageCallBack.loadAndDisplay(imageInfo); imageView.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)); imageView.setScaleType(ImageView.ScaleType.FIT_XY); // 设置图片点击监听 imageView.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { if (mOnPageClickListener != null) { mOnPageClickListener.onClick(v, imageInfo); } } }); container.addView(imageView); return imageView; } @Override public void destroyItem(ViewGroup container, int position, Object object) { container.removeView((View) object); } @Override public int getCount() { return Integer.MAX_VALUE; } @Override public boolean isViewFromObject(View view, Object obj) { return view == obj; } } //开始图片轮播 private void startImageCycle() { handler.sendEmptyMessageDelayed(0, mCycleDelayed); } //暂停图片轮播 private void stopImageCycle() { handler.removeCallbacksAndMessages(null); } //实现自动轮播 private Handler handler = new Handler(new Handler.Callback() { @Override public boolean handleMessage(Message msg) { if (mViewPager != null) { mViewPager.setCurrentItem(mViewPager.getCurrentItem() + 1); handler.sendEmptyMessageDelayed(0, mCycleDelayed); } return false; } }); //触摸停止计时器,抬起启动计时器 @Override public boolean dispatchTouchEvent(MotionEvent event) { if (event.getAction() == MotionEvent.ACTION_UP) { if (isAutoCycle) { // 开始图片滚动 startImageCycle(); } } else { if (isAutoCycle) { // 停止图片滚动 stopImageCycle(); } } return super.dispatchTouchEvent(event); } @Override protected void onDetachedFromWindow() { super.onDetachedFromWindow(); // 停止图片滚动 stopImageCycle(); } @Override protected void onAttachedToWindow() { super.onAttachedToWindow(); if (isAutoCycle) { startImageCycle(); } } //自定义ViewPager,用于事件处理 public class ImageCycleViewPager extends ViewPager { public ImageCycleViewPager(Context context) { super(context); } public ImageCycleViewPager(Context context, AttributeSet attrs) { super(context, attrs); } //事件拦截 @Override public boolean onInterceptTouchEvent(MotionEvent ev) { return super.onInterceptTouchEvent(ev); } //事件分发 @Override public boolean dispatchTouchEvent(MotionEvent ev) { getParent().requestDisallowInterceptTouchEvent(true); return super.dispatchTouchEvent(ev); } //事件处理 @Override public boolean onTouchEvent(MotionEvent ev) { return super.onTouchEvent(ev); } }}
activity_main.xml
<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <com.bwie.myapplication.ImageCycleView android:id="@+id/icv_topView" android:layout_width="match_parent" android:layout_height="200dp"/></RelativeLayout>
view_image_cycle.xml
<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="180dp"> <FrameLayout android:id="@+id/fl_image_cycle" android:layout_width="match_parent" android:layout_height="match_parent"> </FrameLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="30dp" android:layout_alignParentBottom="true" android:background="#66666666" android:gravity="center_vertical"> <LinearLayout android:id="@+id/ll_indication_group" android:layout_width="match_parent" android:layout_height="10dp" android:gravity="right" android:orientation="horizontal" android:paddingRight="15dp"> </LinearLayout> </LinearLayout> <TextView android:id="@+id/tv_text" android:layout_width="match_parent" android:layout_height="30dp" android:layout_alignParentBottom="true" android:gravity="center_vertical" android:paddingLeft="10dp" android:textColor="#ffffffff" android:textSize="15sp" /></RelativeLayout>
以上代码仅供参考
阅读全文
1 0
- Android使用自定义控件实现加载本地图片无限轮播
- Android使用自定义控件实现加载网络图片无限轮播
- Android使用自定义控件实现无限轮播
- Android自定义控件实现无限轮播
- iOS 自定义图片无限轮播控件
- Android自定义控件--无限轮播Banner和Indicator实现
- Android 自定义轮播图片控件使用
- 自定义组合控件,实现无限轮播
- Android自定义控件, 实现图片无限滚动
- XBanner支持图片无限轮播控件,可自定义功能
- Android 无缝轮播实现——本地加载图片轮播(一)
- ViewPager网络加载图片并无限轮播实现
- Banner实现无限轮播Glide加载图片
- Android自定义View实现自动无限轮播,点击图片进入详情页
- Android自定义图片轮播控件
- 自定义Android图片轮播控件
- Android--自定义控件(图片轮播)
- 最简单的本地加载图片无限自动轮播
- 远程连接Mysql,错误代码是1130的解决办法
- easyui datagrid制作复杂表头
- 【mysql】关于IO/内存方面的一些优化
- 血量条
- maven 命令
- Android使用自定义控件实现加载本地图片无限轮播
- 谈判技巧——僵局处理
- MT4之提醒功能
- MDK5(Keil for ARM) 工程建立时遇到的问题集锦
- 参数(条件表)灵活配置GS01/GS02/GS03
- GreenDao的基本配置
- hive UDF
- html垂直自适应布局
- 测试用例设计方法