先说下功能吧,随便设置一个网络图片链接的集合,作为图片的资源。我用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实现轮播的更多相关文章

  1. 仿百度壁纸客户端(二)——主页自定义ViewPager广告定时轮播图

    仿百度壁纸客户端(二)--主页自定义ViewPager广告定时轮播图 百度壁纸系列 仿百度壁纸客户端(一)--主框架搭建,自定义Tab + ViewPager + Fragment 仿百度壁纸客户端( ...

  2. 非常简单的方法实现ViewPager自动循环轮播

    非常简单的方法实现ViewPager自动循环轮播,见红色代码部分,其它的代码可以忽略不看. 简洁高效是我解决问题的首要出发点. package com.shuivy.happylendandreadb ...

  3. ViewPager实现无限轮播踩坑记

    最近笔者想通过ViewPager来实现一个广告Banner,并实现无限轮播的效果,但是在这个过程中踩了不少的坑,听我慢慢道来.如果大家有遇到和我一样的情况,可以参考我的解决方法,没有那就更好,如果针对 ...

  4. 通过ViewPager 实现图片轮播

    通过ViewPager 实现图片轮播 首先来个效果图 布局文件: LinearLayout 用来存放下方的几个小白点. <?xml version="1.0" encodin ...

  5. Viewpager实现图片轮播

    //-------------主布局文件------------------------------------- <LinearLayout xmlns:android="http: ...

  6. android ViewPager实现的轮播图广告自定义视图,网络获取图片和数据

    public class SlideShowAdView extends FrameLayout { //轮播图图片数量    private static int IMAGE_COUNT = 3;  ...

  7. 用viewpager实现图片轮播

    应用中常常遇到图片轮播的需求,这时候就需要用到viewpager这个组件.viewpager是android support v4 中提供的一个组件.viewpager使用需要以下几步骤: 1.在布局 ...

  8. Android ViewPager PagerAdapter 图片轮播

    ViewPager类直接继承了ViewGroup类,所有它是一个容器类,可以在其中添加其他的View类. ViewPager类需要一个PagerAdapter适配器类给它提供数据. ViewPager ...

  9. Android ViewPager实现图片标题轮播和点击事件

    我看别人的文章,最喜欢看有图的.然后先找图看. 那我就先上效果图: 实现了图片自动轮播,手动滑动,轮播标题,以及点击事件.下面开始: 一.资源文件: 首先是布局: <?xml version=& ...

随机推荐

  1. 4,JavaScript数据类型

    学习要点:1.typeof 操作符2.Undefined 类型3.Null 类型4.Boolean 类型5.Number 类型6.String 类型7.Object 类型 ECMAScript 中有 ...

  2. CentOS 中安装nginx

    Centos6.8 yum  安装 nginx  1:使用yum安装nginx,安装nginx库 [root@hadoop110 //]# rpm -Uvh http://nginx.org/pack ...

  3. 【算法笔记】B1028 人口普查

    1028 人口普查 (20 分) 某城镇进行人口普查,得到了全体居民的生日.现请你写个程序,找出镇上最年长和最年轻的人. 这里确保每个输入的日期都是合法的,但不一定是合理的——假设已知镇上没有超过 2 ...

  4. UVA - 11922 区间反转+拼接 可持久化Treap

    题意:一开始给出一个序列\(1,2...n\),然后\(m\)次操作,每次把\([l,r]\)翻转并且拼接到序列的后面,求最后形成的序列 打个pushdown标记就好 #include<iost ...

  5. [转] 完全卸载删除gitlab

    [From] https://yq.aliyun.com/articles/114619 完全卸载删除gitlab 1.停止gitlab gitlab-ctl stop 2.卸载gitlab(注意这里 ...

  6. PIE SDK小波变换

    1.算法功能简介 小波变换是一种信号的时间——尺度分析方法,具有多分辨率分析的特点,而且在时频两域都具有表征信号局部特征的能力,是一种窗口大小固定不变但其形状可变,时间窗和频率窗都可变的时频局部化分析 ...

  7. 获得Windows系统的远程桌面连接历史记录

    转载:http://www.mottoin.com/tech/109219.html 渗透技巧—获得Windows系统的远程桌面连接历史记录 0x00 前言 在渗透测试中,远程桌面连接的历史记录不可忽 ...

  8. Google Authenticator(谷歌身份验证器)

    <!DOCTYPE html>Google Authenticator(谷歌身份验证器) ] Google Authenticator(谷歌身份验证器) Google Authentica ...

  9. web安全——文件上传

    文件上传本身不是漏洞,但如果文件上传功能的限制出现纰漏,允许了不合法且影响网站安全的文件的上传    可以将不合法且影响网站安全稳定性的文件等内容上传的均为“文件上传漏洞”        黑方将文件上 ...

  10. 5. AQS(AbstractQueuedSynchronizer)抽象的队列式的同步器

    5.1 AbstractQueuedSynchronizer里面的设计模式--模板模式 模板模式:父类定义好了算法的框架,第一步做什么第二步做什么,同时把某些步骤的实现延迟到子类去实现. 5.1.1 ...