Android UI编程(9)——ViewPager、Activity

利用ViewPager可以实现滑屏效果,如今智能手机随处可见滑屏效果。最常见的就是手机launcher上的滑屏,以及各大型软件个菜单之间的滑屏,如微信。

参考博客http://blog.csdn.net/harvic880925/article/details/38521865,里面有对ViewPager详细讲解

先看效果图

代码

AndroidManifest.xml——没有做任何修改,创建工程默认

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.wxl.viewpager"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="19" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.wxl.viewpager.MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

activity_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:background="#ffffc0"
    tools:context=".MainActivity" >

    <LinearLayout
        android:layout_width="match_parent"
    	android:layout_height="50dp"
    	android:gravity="center"
    	android:background="#ffffff">

        <TextView
            android:id="@+id/textView1"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_gravity="center"
            android:layout_weight="1"
            android:text="微信"
            android:gravity="center"/>
        <TextView
            android:id="@+id/textView2"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:text="通讯录"
            android:gravity="center"/>
        <TextView
            android:id="@+id/textView3"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:text="发现"
            android:gravity="center"/>
        <TextView
            android:id="@+id/textView4"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:text="我"
            android:gravity="center"/>

    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="5dip">
        <ImageView
	        android:id="@+id/imageView"
	        android:layout_width="match_parent"
	        android:layout_height="match_parent"
	        android:scaleType="centerCrop"
	        android:src="@drawable/a" />
    </LinearLayout>

    <android.support.v4.view.ViewPager
           android:id="@+id/viewPager"
           android:layout_width="wrap_content"
           android:layout_height="wrap_content"
           android:layout_gravity="center" >
     </android.support.v4.view.ViewPager>

</LinearLayout>

lay1.xml

<?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"
    android:gravity="center"
    android:background="#123456">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="第一卡页"
        android:textSize="50sp"
        android:textColor="#ffffff"/>

</LinearLayout>

lay2.xml

<?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:gravity="center"
    android:orientation="vertical"
    android:background="#cccfff">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="第二卡页"
        android:textSize="50sp"
        android:textColor="#ffffff"/>

</LinearLayout>

lay3.xml

<?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"
    android:gravity="center"
    android:background="#00ff00">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="第三卡页"
        android:textSize="50sp"
        android:textColor="#ffffff"/>

</LinearLayout>

lay4.xml

<?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"
    android:gravity="center"
    android:background="#ff00ff">

	<TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="第四卡页"
        android:textSize="50sp"
        android:textColor="#ffffff"/>

</LinearLayout>

MainActivity.java

package com.wxl.viewpager;

import java.util.ArrayList;
import java.util.List;

import android.os.Bundle;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.view.animation.Animation;
import android.view.animation.TranslateAnimation;
import android.widget.ImageView;
import android.widget.LinearLayout.LayoutParams;
import android.widget.TextView;
import android.widget.Toast;
import android.app.Activity;

public class MainActivity extends Activity implements OnClickListener{
	private ViewPager viewPager;//页卡内容
	private List<View> views;// Tab页面列表
	private ImageView imageView;
	private View view1,view2,view3,view4;//各个页卡
	private TextView textView1,textView2,textView3,textView4;

	private int offset = 0;// 动画图片偏移量
    private int currIndex = 0;// 当前页卡编号
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initImageView();
        initViewPager();

        textView1 = (TextView)this.findViewById(R.id.textView1);
        textView2 = (TextView)this.findViewById(R.id.textView2);
        textView3 = (TextView)this.findViewById(R.id.textView3);
        textView4 = (TextView)this.findViewById(R.id.textView4);
        textView1.setOnClickListener(this);
        textView2.setOnClickListener(this);
        textView3.setOnClickListener(this);
        textView4.setOnClickListener(this);
    }  

	@Override
	public void onClick(View arg0) {

		// TODO Auto-generated method stub
		switch (arg0.getId()) {
		case R.id.textView1:
			{
				currIndex = 0;
				break;
			}
		case R.id.textView2:
			{
				currIndex = 1;
				break;
			}
		case R.id.textView3:
			{
				currIndex = 2;
				break;
			}
		case R.id.textView4:
			{
				currIndex = 3;
				break;
			}
		}

		viewPager.setCurrentItem(currIndex);
	}

    /**
      * 初始化动画,这个就是页卡滑动时,下面的横线也滑动的效果,在这里需要计算一些数据
      */  

   private void initImageView() {
       imageView= (ImageView) findViewById(R.id.imageView); 

       // 获取屏幕密度(方法1)
       int screenWidth  = getWindowManager().getDefaultDisplay().getWidth();       // 屏幕宽(像素,如:480px)  

       LayoutParams layoutParams = (LayoutParams)imageView.getLayoutParams();
       layoutParams.width = screenWidth/4;
       imageView.setLayoutParams(layoutParams);

       offset = layoutParams.width;

   } 

   private void initViewPager() {
        viewPager=(ViewPager) findViewById(R.id.viewPager);
        views=new ArrayList<View>();
        LayoutInflater inflater=getLayoutInflater();
        view1=inflater.inflate(R.layout.lay1, null);
        view2=inflater.inflate(R.layout.lay2, null);
        view3=inflater.inflate(R.layout.lay3, null);
        view4=inflater.inflate(R.layout.lay4, null);
        views.add(view1);
        views.add(view2);
        views.add(view3);
        views.add(view4);
        viewPager.setAdapter(new MyViewPagerAdapter(views));
        viewPager.setCurrentItem(0);
        viewPager.setOnPageChangeListener(new MyOnPageChangeListener());
    }

    public class MyViewPagerAdapter extends PagerAdapter{
        private List<View> mListViews;  

        public MyViewPagerAdapter(List<View> mListViews) {
            this.mListViews = mListViews; //构造方法,参数是我们的页卡,这样比较方便
        }  

        @Override
        public void destroyItem(ViewGroup container, int position, Object object)   {
            container.removeView(mListViews.get(position));  //删除页卡
        }  

        @Override  //这个方法用来实例化页卡
        public Object instantiateItem(ViewGroup container, int position) {
             container.addView(mListViews.get(position), 0);  //添加页卡
             return mListViews.get(position);
        }  

        @Override
        public int getCount() {
            return  mListViews.size();  //返回页卡的数量
        }  

        @Override
        public boolean isViewFromObject(View arg0, Object arg1) {
            return arg0==arg1;  //官方提示这样写
        } 

        @Override
        public int getItemPosition(Object object) {
        	return POSITION_NONE;
        }
    } 

    public class MyOnPageChangeListener implements OnPageChangeListener{  

        int one = offset;// 页卡1 -> 页卡2 偏移量
        public void onPageScrollStateChanged(int arg0) {  

        }  

        public void onPageScrolled(int arg0, float arg1, int arg2) {  

        }  

        public void onPageSelected(int arg0) {  

            Animation animation = new TranslateAnimation(one*currIndex, one*arg0, 0, 0);
            currIndex = arg0;
            animation.setFillAfter(true);// True:图片停在动画结束位置
            animation.setDuration(300);
            imageView.startAnimation(animation);
            Toast.makeText(MainActivity.this, "您选择了"+ (viewPager.getCurrentItem()+1)+"页卡", Toast.LENGTH_SHORT).show();
        }  

    }
}

总结

获取布局视图

LayoutInflater inflater=getLayoutInflater();
view1=inflater.inflate(R.layout.lay1, null);
view2=inflater.inflate(R.layout.lay2, null);
view3=inflater.inflate(R.layout.lay3, null);
view4=inflater.inflate(R.layout.lay4, null);

缺陷

点击标题栏中的“微信”、“通讯录”、“发现”、“我”的时候,卡页之间不是直接跳跃过去,而不是一步一步跳过去的。即如果当前卡页处于卡页1,现在点击到卡页3时,是先跳跃到卡页2,在跳跃卡页3的,可以很明显看出。

时间: 2024-09-29 20:46:28

Android UI编程(9)——ViewPager、Activity的相关文章

Android UI编程之自定义控件初步——ImageButton

概述: 我想我们在使用一些App的时候,应该不会出现一些"裸控件"的吧.除非是一些系统中的软件,那是为了保持风格的一致性,做出的一些权衡.我这里并非是在指责Android原生的控件不好看,说实在的,我很喜欢Android的一些原生控件.只是有些时候为了风格的一致性,就不得不去花些功夫在美工上.这于美工这一点,我对某讯的产品的确欣赏.下面就让我们开始一点一点学习Android UI编程中的自定义控件. 分析: 自定义控件就点像堆积木,并给它涂上颜色,和功能说明.下面就让我们用一个例子来逐

Android UI编程(6)——HandlerThread

介绍: HandlerThread继承Thread,当线程开启时,也就是它run方法运行起来后,线程同时创建了一个含有消息队列的Looper,并对外提供自己这个Looper对象的get方法,这就是它和普通Thread唯一不同的地方. 好处: 为什么要使用HandlerThread 1.开发中如果多次使用类似new Thread(){}.start(); 这种方式开启一个子线程,会创建多个匿名线程,使得程序运行越来越慢,而HandlerThread自带Looper使他可以通过消息来多次重复使用当前

Android UI编程之自定义控件初步(下)——CustomEditText

概述: 基于对上一篇博客<Android UI编程之自定义控件初步(上)--ImageButton>的学习,我们对自定义控件也有了一个初步的认识.那现在我们可以再试着对EditText进行一些自定义的学习.以下有两种方式的自定义UI编程分享给大家. 示例:带删除按钮的输入框 效果图展示:   基本雏形搭建: 大家可以从上面的效果图上看到两个东西:左侧的EditText和右侧的图片(这里是一个Button).我们在EditText中的输入为空的时候,不显示右侧的清除按钮.一旦EditText中输

Android UI编程(7)——Fragment

Fragment是Activity的界面中的一部分或一种行为.你可以把多个Fragment们组合到一个Activity中来创建一个多面界面并且可以在多个Activity中重用一个Fragment.也可以把Fragment认为模块化的一段Activity,它具有自己的生命周期,接收它自己的事件,并可以在Activity运行时被添加或删除. Fragment不能独立存在,它必须嵌入到activity中,而且Fragment的生命周期直接受所在的Activity的影响.例如:当Activity暂停时,

Android UI编程(4)——Thread、Message、Handler

当应用程序启动时,会开启一个主线程(也就是UI线程),由它来管理UI,监听用户点击,来响应用户并分发事件等.所有一般在主线程中不要执行比较耗时的操作,如延时.下载网络数据.死循环,否则出现ANR错误.所以就将这些操作放在子线程中,但是由于Android UI线程是不安全的,所有只能在主线程中更新UI.使用Thread来创建子线程.使用Message来存储数据.使用Handler来处理消息数据. 总结: 1.子线程与UI主线程之间通过Message来传递数据,需要创建一个新类(MyHandler)

Android UI编程(5)——Looper

Looper通常是运行在一个消息的循环队列中的这个线程中,线程默认不会提供一个循环的消息去关联它们,即在一般的线程中是没有一个消息队列去关联这个消息的.那么如果线程想管理这些消息,就必须在此线程中调用Looper.prepare()使这个消息队列运行起来,并且调用Looper.loop()这个方法使它消息队列一直运行到停止.而Handler就是消息队列一个交互消息,包括从将消息发到消息队列,以及从消息队列取出消息并处理. 总结: Android使用Message对象来管理消息数据,并将这些Mes

Android UI编程(2)——多级列表(ExpandableListView)

参考博客: http://blog.csdn.net/xyz_lmn/article/details/6906268 http://www.apkbus.com/android-124715-1-1.html 有时候,使用ListView并不能满足应用程序所需要的功能.有些应用程序需要多组ListViw,这时候我们就要使用一种新的控件ExpandableListView--可以扩展的ListView.它的作用就是将ListView进行分组.就好像我们使用QQ的时候,有"我的好友",&q

Android UI编程(1)——九宫格(GridView)

参考博客:http://blog.csdn.net/xyz_lmn/article/details/6906255 总结: 1.GridView(网格视图)按照行列来显示内容,每个网格可以用已有的布局或自定义的布局来填充,并且GridView每行可以显示多个网格,即有列数之说. 2.GridView需要结合适配器(Adapter)一起使用,使用GridView类的实例对象中的setAdapter方法初始化网格视图,即gridView.setAdapter(myAdapter). 3.将GridV

Android UI编程(8)——动态加载Fragment

通过动态加载fragment实现在一个Activity拥有3种不同的布局,直接看效果图吧: 常规模式下: 点击家居控制: 代码: AndroidManifest.xml--没有做任何修改,创建工程默认 <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package