android viewpaper实例探讨

一、首先,我们来看一下效果图,这是新浪微博的Tab滑动效果。我们可以手势滑动,也可以点击上面的头标进行切换。与此同方式,白色横条会移动到相应的页卡头标下。这是一个动画效果,白条是缓慢滑动过去的。好了,接下来我们就来实现它。

二、在开始前,我们先要认识一个控件,ViewPager。它是google SDk中自带的一个附加包的一个类,可以用来实现屏幕间的切换。这个附加包是android-support-v4。jar,在最后的源码中会提供给大 家,在libs文件夹中。当然你也可以自己从网上搜索最新的版本。找到它后,我们需要在项目中添加

三、我们先做界面, 界面设计很简单,第一行三个头标,第二行动画图片,第三行页卡内容展示。


代码如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:umadsdk="http://schemas.android.com/apk/res/com.LoveBus"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<LinearLayout
android:id="@+id/linearLayout1"
android:layout_width="fill_parent"
android:layout_height="100.0dip"
android:background="#FFFFFF" >
<TextView
android:id="@+id/text1"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_weight="1.0"
android:gravity="center"
android:text="页卡1"
android:textColor="#000000"
android:textSize="22.0dip" />
<TextView
android:id="@+id/text2"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_weight="1.0"
android:gravity="center"
android:text="页卡2"
android:textColor="#000000"
android:textSize="22.0dip" />
<TextView
android:id="@+id/text3"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_weight="1.0"
android:gravity="center"
android:text="页卡3"
android:textColor="#000000"
android:textSize="22.0dip" />
</LinearLayout>
<ImageView
android:id="@+id/cursor"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:scaleType="matrix"
android:src="@drawable/a" />
<android.support.v4.view.ViewPager
android:id="@+id/vPager"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_weight="1.0"
android:background="#000000"
android:flipInterval="30"
android:persistentDrawingCache="animation" />
</LinearLayout>

我们要展示三个页卡,所以还需要三个页卡内容的界面设计,这里我们只设置了背景颜色,能起到区别作用即可。


代码如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
android:background="#158684" >
</LinearLayout>

四、代码部分要进行初始化的工作 (1) 先来变量的定义


代码如下:

private ViewPager mPager;//页卡内容
private List<View> listViews; // Tab页面列表
private ImageView cursor;// 动画图片
private TextView t1, t2, t3;// 页卡头标
private int offset = 0;// 动画图片偏移量
private int currIndex = 0;// 当前页卡编号
private int bmpW;// 动画图片宽度

(2) 初始化头标


代码如下:

/**
* 初始化头标
*/
private void InitTextView() {
t1 = (TextView) findViewById(R.id.text1);
t2 = (TextView) findViewById(R.id.text2);
t3 = (TextView) findViewById(R.id.text3);
t1.setOnClickListener(new MyOnClickListener(0));
t2.setOnClickListener(new MyOnClickListener(1));
t3.setOnClickListener(new MyOnClickListener(2));
}
/**
* 头标点击监听
*/
public class MyOnClickListener implements View.OnClickListener {
private int index = 0;
public MyOnClickListener(int i) {
index = i;
}
@Override
public void onClick(View v) {
mPager.setCurrentItem(index);
}
};

(3) 初始化页卡内容区


代码如下:

<font color="#008000"><font color="black">  /**
  * ViewPager适配器
  */
  public class MyPagerAdapter extends PagerAdapter {
  public List<View> mListViews;
  public MyPagerAdapter(List<View> mListViews) {
  this.mListViews = mListViews;
  }
  @Override
  public void destroyItem(View arg0, int arg1, Object arg2) {
  ((ViewPager) arg0).removeView(mListViews.get(arg1));
  }
  @Override
  public void finishUpdate(View arg0) {
  }
  @Override
  public int getCount() {
  return mListViews.size();
  }
  @Override
  public Object instantiateItem(View arg0, int arg1) {
  ((ViewPager) arg0).addView(mListViews.get(arg1), 0);
  return mListViews.get(arg1);
  }
  @Override
  public boolean isViewFromObject(View arg0, Object arg1) {
  return arg0 == (arg1);
  }
  @Override
  public void restoreState(Parcelable arg0, ClassLoader arg1) {
  }
  @Override
  public Parcelable saveState() {
  return null;
  }
  @Override
  public void startUpdate(View arg0) {
  }
  }
</font></font>
这里我们实现了各页卡的装入和卸载 (4) 初始化动画
/**
* 初始化动画
*/
private void InitImageView() {
cursor = (ImageView) findViewById(R.id.cursor);
bmpW = BitmapFactory.decodeResource(getResources(), R.drawable.a)
.getWidth();// 获取图片宽度
DisplayMetrics dm = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dm);
int screenW = dm.widthPixels;// 获取分辨率宽度
offset = (screenW / 3 - bmpW) / 2;// 计算偏移量
Matrix matrix = new Matrix();
matrix.postTranslate(offset, 0);
cursor.setImageMatrix(matrix);// 设置动画初始位置
}

根据屏幕的分辨率和图片的宽度计算动画移动的偏移量   


代码如下:

/**   * 页卡切换监听   */   
public class MyOnPageChangeListener implements OnPageChangeListener {   
int one = offset * 2 + bmpW;// 页卡1 -> 页卡2 偏移量   
int two = one * 2;// 页卡1 -> 页卡3 偏移量   
@Override   
public void onPageSelected(int arg0) {   
Animation animation = null;   
switch (arg0) {   
case 0:   
if (currIndex == 1) {   
animation = new TranslateAnimation(one, 0, 0, 0);   }
else if (currIndex == 2) {   
animation = new TranslateAnimation(two, 0, 0, 0);   }   
break;   case 1:   if (currIndex == 0) {   
animation = new TranslateAnimation(offset, one, 0, 0);   
} else if (currIndex == 2) {   
animation = new TranslateAnimation(two, one, 0, 0);   }   
break;   case 2:   if (currIndex == 0) {   
animation = new TranslateAnimation(offset, two, 0, 0);   }
else if (currIndex == 1) {   animation = new TranslateAnimation(one, two, 0, 0);   }   
break;   }   
currIndex = arg0;   
animation.setFillAfter(true);// True:图片停在动画结束位置   
animation.setDuration(300);   
cursor.startAnimation(animation);   }   
@Override   
public void onPageScrolled(int arg0, float arg1, int arg2) {   }   
@Override   
public void onPageScrollStateChanged(int arg0) {   }   }

五、打完收工,快来看看自己的劳动成果吧

(0)

相关推荐

  • android viewpaper实例探讨

    一.首先,我们来看一下效果图,这是新浪微博的Tab滑动效果.我们可以手势滑动,也可以点击上面的头标进行切换.与此同方式,白色横条会移动到相应的页卡头标下.这是一个动画效果,白条是缓慢滑动过去的.好了,接下来我们就来实现它. 二.在开始前,我们先要认识一个控件,ViewPager.它是google SDk中自带的一个附加包的一个类,可以用来实现屏幕间的切换.这个附加包是android-support-v4.jar,在最后的源码中会提供给大 家,在libs文件夹中.当然你也可以自己从网上搜索最新的版

  • Kotlin开发Android应用实例详解

    Kotlin开发Android应用实例详解 相关文章:关于Kotlin语言的基础介绍: http://www.jb51.net/article/114086.htm 我们简单的知道了Kotlin这门新语言的优势,也接触了一些常见的语法及其简单的使用,相信你会对它有浓厚的兴趣,暂且理解为对它感兴趣吧,哈哈哈.那么,我们该如何在Android中应用这门新的语言呢?今天的这篇文章带你学习使用Kotlin开发Android应用,并对比我们传统语言Java,让你真真切切的感受到他的美和优雅. 配置 项目g

  • Android startActivityForResult实例详解

    Android startActivityForResult实例详解 startActivityForResult用于两个activity之间的数据传递,Activity1传值给Activity2,Activity2再返回值给Activity1. 第一步:Activity1中:startActivityForResult(Intent intent, Int requestCode) Intent intent = new Intent(); intent.setClass(Activity1.

  • Android版本更新实例详解

    Android版本更新实例详解 1.导入xutils的jar包 2.在AndroidManifest.xml中添加权限 3.选择下载的路径,和下载apk文件的网址 private String url="http://www.oschina.NET/uploads/osc-Android-v2.6.4-release.apk"; private String sdPath = "/sdcard/" + System.currentTimeMillis() + &qu

  • Android开发实例之登录界面的实现

    本文要演示的Android开发实例是如何完成一个Android中的miniTwitter登录界面,下面将分步骤讲解怎样实现图中的界面效果,让大家都能轻松的做出美观的登录界面.        miniTwitter登录界面效果图 先贴上最终要完成的效果图:   miniTwitter登录界面的布局分析 首先由界面图分析布局,基本可以分为三个部分,下面分别讲解每个部分. 第一部分是一个带渐变色背景的LinearLayout布局,关于背景渐变色就不再贴代码了,效果如下图所示: 第二部分,红色线区域内,

  • Android ListView 实例讲解清晰易懂

    一.前言 在某些场景下,单一文字的ListView Item已不适合当前需求,因此需要我们自定义Item布局来满足需求.下面我们来实现一个带图标和文字的Item. 二.代码展示 1.定义包含ListView的布局文件activity_main.xml,Activity在onCreate()时加载. <?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.Con

  • Android开发实例之多点触控程序

    智能终端设备的多点触控操作为我们带来了种种炫酷体验,这也使得很多Android开发者都对多点触控程序的开发感兴趣.实际上多点触控程序的实现并不是那么遥不可及,而是比较容易.本文就主要通过一个实例具体讲解多点触控程序的实现.        首先来了解一下Android中多点触控的原理. Android多点触控在本质上需要LCD驱动和程序本身设计上支持,目前市面上HTC.Motorola和Samsung等知名厂商只要使用电容屏触控原理的手机均可以支持多点触控Multitouch技术,对于网页缩放.手

  • Android观察者模式实例分析

    本文实例讲述了Android观察者模式.分享给大家供大家参考.具体分析如下: 一.环境: 主机:WIN8 开发环境:Eclipse 二.说明: 1.打开sd卡中的xml文件,如果不存在,这新建一个,并写入默认配置 2.读取xml文件 3.Config_Info.java为配置信息数据结构 4.IF_Config.java为配置类的存取接口,其他类可以通过此接口直接获取配置信息 5.IF_Subject_Config.java为观察者模式目标类接口 6.IF_Observer_Config.jav

  • Native.js获取监听开关等操作Android蓝牙设备实例代码

    Native.js开启关闭蓝牙 var main = plus.android.runtimeMainActivity(); var Context = plus.android.importClass("android.content.Context"); var BManager = main.getSystemService(Context.BLUETOOTH_SERVICE); plus.android.importClass(BManager);//引入相关的method函数

  • Android单一实例全局可调用网络加载弹窗

    最近因为项目需求,需要完成一个全局的网络加载弹窗需求,真正完成这个需求之后,感觉最重要的不是结果,而是思维. 我刚开始接到这个需求的时候,第一种想到的方案是 基类加单例.但是实际做起来之后发现,因为单例的原因,你的弹窗只能在第一次创建这个单例的activity中显示出来. 那么发现这个问题之后在这个的基础上改进一下,如果我不用activity的上下文,而是采用类似于Application的一种全局上下文呢?当然,个人能力有限,这种想法就给毙掉了,后来由导师指点,利用service的上下文,dia

随机推荐