ViewPager+handler实现轮播
先说下功能吧,随便设置一个网络图片链接的集合,作为图片的资源。我用ImageLoader来加载图片,在图片未加载完成时会ProgressBar加载状态
在Handler发送一个空消息来实现页面的轮播
我如下是代码我写在一个类中方面观察
补充1 我在scrollview下嵌套ViewPager 会发现VIewPager随便滑动的时候不好使,只有水平方向滑动才行
所以可以自定义MyScrollView
package com.example.huanshop.widget; import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.widget.ScrollView; public class MyScrollView extends ScrollView { private float xDistance;
private float yDistance;
private float xLast;
private float yLast; public MyScrollView(Context context) {
super(context);
// TODO Auto-generated constructor stub
} public MyScrollView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
// TODO Auto-generated constructor stub
} public MyScrollView(Context context, AttributeSet attrs) {
super(context, attrs);
// TODO Auto-generated constructor stub
} @Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN:
xDistance = yDistance = 0.0f;
xLast = ev.getX();
yLast = ev.getY();
break;
case MotionEvent.ACTION_MOVE:
final float curX = ev.getX();
final float curY = ev.getY();
xDistance += Math.abs(curX - xLast);
yDistance += Math.abs(curY - yLast);
if (xDistance > yDistance)
return false;
break;
default:
break;
}
return super.onInterceptTouchEvent(ev);
} }
补充2 由于屏幕适配的因素而使小点在不同的机子上显示的大小不同达不到想要的效果
可以再用尺寸适配来处理下
dp和px的关系: dp = px/设备密度
float density = getResources().getDisplayMetrics().density;
System.out.println("设备密度:" + density);
320*240(0.75), 480*320(1),480*800(1.5),1280*720(2)
values->dimens.xml values-1280x720
public class DensityUtils {
/**
* 将dp转为px
*/
public static int dp2px(Context ctx, float dp) {
float density = ctx.getResources().getDisplayMetrics().density;
int px = (int) (dp * density + 0.5f);// 4.9->5 4.4->4 return px;
} public static float px2dp(Context ctx, int px) {
float density = ctx.getResources().getDisplayMetrics().density;
float dp = px / (density + 0.5f); return dp;
}
}
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
DensityUtils.dp2px(this, 10), DensityUtils.dp2px(this, 10));
if (i > 0) {
params.leftMargin = DensityUtils.dp2px(this, 10);// 设置圆点间隔
}
package com.demo.sb.main; import com.demo.suibian.R;
import com.nostra13.universalimageloader.core.DisplayImageOptions;
import com.nostra13.universalimageloader.core.ImageLoader;
import com.nostra13.universalimageloader.core.assist.FailReason;
import com.nostra13.universalimageloader.core.assist.ImageScaleType;
import com.nostra13.universalimageloader.core.display.FadeInBitmapDisplayer;
import com.nostra13.universalimageloader.core.listener.SimpleImageLoadingListener; import android.app.Activity;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.view.ViewTreeObserver.OnGlobalLayoutListener;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.ImageView.ScaleType;
import android.widget.LinearLayout;
import android.widget.ProgressBar;
import android.widget.RelativeLayout; public class Activity_Other extends Activity {
private ViewPager viewPager;
private ImageLoader loader;
private DisplayImageOptions options;
// private
// private static final int[] mImageIds = new int[] { R.drawable.guide_1,
// R.drawable.guide_2, R.drawable.guide_3 }; // 网上的图片资源
public static final String[] IMAGES = new String[] {
"http://image.tianjimedia.com/uploadImages/2012/067/ORQR14KR5DDC.jpg",
"http://image.tianjimedia.com/uploadImages/2012/067/X6BEO07U962E.jpg",
"http://image.tianjimedia.com/uploadImages/2012/067/F9X84V2ST716.jpg",
"http://image.tianjimedia.com/uploadImages/2012/067/RY445ENQ16BH.jpg",
"http://image.tianjimedia.com/uploadImages/2012/067/74KAJLN0JL95.jpg",
"http://image.tianjimedia.com/uploadImages/2012/067/N80N0GUA36N0.jpg" }; // private ArrayList<ImageView> mImageViewList; private LinearLayout llPointGroup;// 引导圆点的父控件 private int mPointWidth;// 圆点间的距离 private View viewRedPoint;// 小红点
// private Handler mhandler; private Handler mhandler = new Handler() {
public void handleMessage(Message msg) {
int currentItem = viewPager.getCurrentItem();
if (currentItem < IMAGES.length - 1) {
currentItem++;
} else {
currentItem = 0;
}
viewPager.setCurrentItem(currentItem);// 切换到下个页面
mhandler.sendEmptyMessageDelayed(0, 3000);//继续延迟3秒发送消息让Handler继续执行 形成循环
};
}; @Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_other); loader = ImageLoader.getInstance();
options = new DisplayImageOptions.Builder()
.showImageForEmptyUri(R.drawable.ic_empty)
.showImageOnFail(R.drawable.ic_error)
.resetViewBeforeLoading(true).cacheOnDisc(false)
.cacheInMemory(true).imageScaleType(ImageScaleType.EXACTLY)
.bitmapConfig(Bitmap.Config.RGB_565)
.displayer(new FadeInBitmapDisplayer(300)).build(); viewPager = (ViewPager) findViewById(R.id.viewpager1);
llPointGroup = (LinearLayout) findViewById(R.id.ll_point_group);
viewRedPoint = findViewById(R.id.view_red_point); initViews();
viewPager.setAdapter(new GuideAdapter());
viewPager.setOnPageChangeListener(new GuidePageListener());
mhandler.sendEmptyMessageDelayed(0, 3000);// 延时3秒后发送消息让handler来实现轮播
} private void initViews() {
// TODO Auto-generated method stub
// mImageViewList = new ArrayList<ImageView>();
//
// // // 初始化引导页的3个页面
// for (int i = 0; i < mImageIds.length; i++) {
// ImageView image = new ImageView(this);
// image.setBackgroundResource(mImageIds[i]);// 设置引导页背景
// mImageViewList.add(image);
// }
for (int i = 0; i < IMAGES.length; i++) {
View point = new View(this);
point.setBackgroundResource(R.drawable.point_normal);// 设置引导页默认圆点
point.setPadding(5, 5, 5, 5);
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
10, 10);
if (i > 0) {
params.leftMargin = 10;// 设置圆点间隔
} point.setLayoutParams(params);// 设置圆点的大小 llPointGroup.addView(point);// 将圆点添加给线性布局
} // 获取视图树, 对layout结束事件进行监听
llPointGroup.getViewTreeObserver().addOnGlobalLayoutListener(
new OnGlobalLayoutListener() { // 当layout执行结束后回调此方法
@Override
public void onGlobalLayout() {
System.out.println("layout 结束");
llPointGroup.getViewTreeObserver()
.removeGlobalOnLayoutListener(this);
mPointWidth = llPointGroup.getChildAt(1).getLeft()
- llPointGroup.getChildAt(0).getLeft();
System.out.println("圆点距离:" + mPointWidth);
}
}); } /**
* 触摸监听 当按下时不进行轮播
*
* @author Administrator
*
*/
class NewTouchListener implements OnTouchListener { @Override
public boolean onTouch(View arg0, MotionEvent arg1) {
switch (arg1.getAction()) {
case MotionEvent.ACTION_DOWN:
System.out.println("按下了");
mhandler.removeCallbacksAndMessages(null);
break;
case MotionEvent.ACTION_CANCEL:
System.out.println("事件取消");
mhandler.sendEmptyMessageDelayed(0, 3000);
break;
case MotionEvent.ACTION_UP:
System.out.println("抬起");
mhandler.sendEmptyMessageDelayed(0, 3000);
break;
default:
break;
}
return true;
} } /**
* ViewPager数据适配器
*
* @author Kevin
*
*/
class GuideAdapter extends PagerAdapter { @Override
public int getCount() {
return IMAGES.length;
} @Override
public boolean isViewFromObject(View arg0, Object arg1) {
return arg0 == arg1;
} @Override
public Object instantiateItem(ViewGroup container, int position) { // ImageView imageView = new ImageView(Activity_Other.this);
// imageView.setScaleType(ScaleType.FIT_XY);
// loader.displayImage(IMAGES[position], imageView, options);
// container.addView(imageView);
// imageView.setOnTouchListener(new NewTouchListener());
// return imageView;
View imageLayout = View.inflate(Activity_Other.this,
R.layout.item_pager_image, null);
ImageView imageView = (ImageView) imageLayout
.findViewById(R.id.image);
imageView.setScaleType(ScaleType.FIT_XY);
ProgressBar spinBar = (ProgressBar) imageLayout
.findViewById(R.id.loading);
loader.displayImage(IMAGES[position], imageView, options,
new MySimpleLoading(spinBar));
container.addView(imageLayout);
imageView.setOnTouchListener(new NewTouchListener());
return imageLayout;
} @Override
public void destroyItem(ViewGroup container, int position, Object object) {
container.removeView((View) object);
}
} class MySimpleLoading extends SimpleImageLoadingListener {
ProgressBar spinBar; public MySimpleLoading(ProgressBar spinBar) {
// TODO Auto-generated constructor stub
this.spinBar = spinBar;
}
//开始加载
@Override
public void onLoadingStarted(String imageUri, View view) {
// TODO Auto-generated method stub
spinBar.setVisibility(View.VISIBLE);
}
//加载失败
@Override
public void onLoadingFailed(String imageUri, View view,
FailReason failReason) {
// TODO Auto-generated method stub
String message = null;
switch (failReason.getType()) {
case IO_ERROR:
message = "Input/Output error";
break;
case DECODING_ERROR:
message = "Image can't be decoded";
break;
case NETWORK_DENIED:
message = "Downloads are denied";
break;
case OUT_OF_MEMORY:
message = "Out Of Memory error";
break;
case UNKNOWN:
message = "Unknown error";
break;
}
Log.i("ImagePagerAdapter", message);
spinBar.setVisibility(View.GONE);
}
//加载完成
@Override
public void onLoadingComplete(String imageUri, View view,
Bitmap loadedImage) {
// TODO Auto-generated method stub
spinBar.setVisibility(View.GONE);
} } /**
* viewpager的滑动监听
*
* @author Kevin
*
*/
class GuidePageListener implements OnPageChangeListener { // 滑动事件
@Override
public void onPageScrolled(int position, float positionOffset,
int positionOffsetPixels) {
// System.out.println("当前位置:" + position + ";百分比:" + positionOffset
// + ";移动距离:" + positionOffsetPixels);
int len = (int) (mPointWidth * positionOffset) + position
* mPointWidth;
RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) viewRedPoint
.getLayoutParams();// 获取当前红点的布局参数
params.leftMargin = len;// 设置左边距 viewRedPoint.setLayoutParams(params);// 重新给小红点设置布局参数
} // 某个页面被选中
@Override
public void onPageSelected(int position) { } // 滑动状态发生变化
@Override
public void onPageScrollStateChanged(int state) { } }
}
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" > <RelativeLayout
android:layout_width="match_parent"
android:id="@+id/rl_root"
android:layout_height="200dp" > <android.support.v4.view.ViewPager
android:id="@+id/viewpager1"
android:layout_width="match_parent"
android:layout_height="match_parent" /> <RelativeLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:layout_marginBottom="20dp" > <LinearLayout
android:id="@+id/ll_point_group"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal" >
</LinearLayout> <View
android:id="@+id/view_red_point"
android:layout_width="8dp"
android:layout_height="8dp"
android:background="@drawable/point_selecte" />
</RelativeLayout>
</RelativeLayout> <TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/app_name" /> </LinearLayout>
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:padding="1dip" > <ImageView
android:id="@+id/image"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:adjustViewBounds="true"
android:contentDescription="@null"
android:scaleType="fitXY" /> <ProgressBar
android:id="@+id/loading"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:visibility="gone" /> </FrameLayout>
其实在android里 if(text ==null || text.length()==0)是有封装的。
在android.text.TextUtils里
public static boolean isEmpty(CharSequence str) {
if (str == null || str.length() == 0)
return true;
else
return false;
}
所以我们可以使用
TextUtils.isEmpty(text)
代替
if(text == null || text.length() == 0)
ViewPager+handler实现轮播的更多相关文章
- 仿百度壁纸客户端(二)——主页自定义ViewPager广告定时轮播图
仿百度壁纸客户端(二)--主页自定义ViewPager广告定时轮播图 百度壁纸系列 仿百度壁纸客户端(一)--主框架搭建,自定义Tab + ViewPager + Fragment 仿百度壁纸客户端( ...
- 非常简单的方法实现ViewPager自动循环轮播
非常简单的方法实现ViewPager自动循环轮播,见红色代码部分,其它的代码可以忽略不看. 简洁高效是我解决问题的首要出发点. package com.shuivy.happylendandreadb ...
- ViewPager实现无限轮播踩坑记
最近笔者想通过ViewPager来实现一个广告Banner,并实现无限轮播的效果,但是在这个过程中踩了不少的坑,听我慢慢道来.如果大家有遇到和我一样的情况,可以参考我的解决方法,没有那就更好,如果针对 ...
- 通过ViewPager 实现图片轮播
通过ViewPager 实现图片轮播 首先来个效果图 布局文件: LinearLayout 用来存放下方的几个小白点. <?xml version="1.0" encodin ...
- Viewpager实现图片轮播
//-------------主布局文件------------------------------------- <LinearLayout xmlns:android="http: ...
- android ViewPager实现的轮播图广告自定义视图,网络获取图片和数据
public class SlideShowAdView extends FrameLayout { //轮播图图片数量 private static int IMAGE_COUNT = 3; ...
- 用viewpager实现图片轮播
应用中常常遇到图片轮播的需求,这时候就需要用到viewpager这个组件.viewpager是android support v4 中提供的一个组件.viewpager使用需要以下几步骤: 1.在布局 ...
- Android ViewPager PagerAdapter 图片轮播
ViewPager类直接继承了ViewGroup类,所有它是一个容器类,可以在其中添加其他的View类. ViewPager类需要一个PagerAdapter适配器类给它提供数据. ViewPager ...
- Android ViewPager实现图片标题轮播和点击事件
我看别人的文章,最喜欢看有图的.然后先找图看. 那我就先上效果图: 实现了图片自动轮播,手动滑动,轮播标题,以及点击事件.下面开始: 一.资源文件: 首先是布局: <?xml version=& ...
随机推荐
- Optimizing and caching browser bundles...
扎心了,老铁!!! 他妈的,弄了几天都是卡在这里!!上网查了一下.说是我的内存不够,好吧.我慢慢等,然而让我等了好几天都没什么反应..两天了,一直卡在这里.今天在虚拟机也是发狠了. 我直接把虚拟机的内 ...
- 老男孩python作业2-购物车程序
购物车程序要求: 1.启动程序后,输入用户名密码后,如果是第一次登录,让用户输入工资,然后打印商品列表 2.允许用户根据商品编号购买商品 3.用户选择商品后,检测余额是否够,够就直接扣款,不够就提醒 ...
- PHP 位运算符
位运算符 位运算符是指对二进制位从低位到高位对齐后进行运算. 符号 作用 举例 个人理解 & 按位与 $m & $n 全1为1,否则为0 | 按位或 $m | $n 全0为0,有1为1 ...
- Covering(矩阵快速幂)
Bob's school has a big playground, boys and girls always play games here after school. To protect b ...
- Codeforces 1136D Nastya Is Buying Lunch (贪心)
题意: 给一个序列和一组交换序列(a,b),当且仅当a在b的前面(不允许有间隔),这两个数才能交换,问最后一个数最多能移动多少个位置. 分析: 这题是思路是十分的巧妙呀 , 用一个数组num[x] ...
- OJ 21658::Monthly Expense(二分搜索+最小化最大值)
Description Farmer John是一个令人惊讶的会计学天才,他已经明白了他可能会花光他的钱,这些钱本来是要维持农场每个月的正常运转的.他已经计算了他以后N(1<=N< ...
- [转] 完全卸载删除gitlab
[From] https://yq.aliyun.com/articles/114619 完全卸载删除gitlab 1.停止gitlab gitlab-ctl stop 2.卸载gitlab(注意这里 ...
- Python Flask框架之页面跳转
IDE用的PyCharm(还是vs强大啊). 项目结构: 2:页面: <!doctype html> <html lang="zh"> <head&g ...
- NPOI开发手记
目录 注意事项 读取Excel 创建Excel表 保存Excel 行 列 单元格样式 添加公式 Dataset.DataGridView转换Excel帮助类 NPOI其实就是POI的.NET移植 项目 ...
- pjsip与QT进行适配
pjsip是纯C语言写的一个sip协议库,整个代码写得还是比较模块化的,得益于此的设计,只要理解了pjsip的设计,就可以对其网络层进行扩展. 我们项目是QT作为主要开发工具,而PJSIP的库默认是利 ...