Android ViewPager导航------平凡中有奇迹

ViewPager做导航想不想有这样的效果:

比如说有四张图片,下面有四个圆点,当页面滑动的时候一个点变大一个点变小(或者是一个点变小一个点变大),等于说同时在执行两个动画。

package com.example.day_2014_10_17_viewpager;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedHashMap;

import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.widget.ImageView;

import com.nineoldandroids.view.ViewHelper;
import com.panpass.adapter.MyViewPagerAdapter;
import com.panpass.view.MyViewPager;
import com.panpass.view.MyViewPager.DiyPageScrollListener;

public class MainActivity extends Activity {

	private Context mContext = this;
	private MyViewPager mViewPager;
	private ImageView imageView1, imageView2, imageView3, imageView4;
	private ArrayList<ImageView> mList;
	private HashMap<Integer, ImageView> mHashMap = new LinkedHashMap<Integer, ImageView>();
	private static final float SCALE_MAX = 0.55f;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		mList = new ArrayList<ImageView>();
		ImageView img = new ImageView(mContext);
		img.setBackgroundResource(R.drawable.guide_page1);
		mList.add(img);
		img = new ImageView(mContext);
		img.setBackgroundResource(R.drawable.guide_page2);
		mList.add(img);
		img = new ImageView(mContext);
		img.setBackgroundResource(R.drawable.guide_page3);
		mList.add(img);
		img = new ImageView(mContext);
		img.setBackgroundResource(R.drawable.guide_page4);
		mList.add(img);
		mViewPager = (MyViewPager) findViewById(R.id.view_pager);
		mViewPager.setAdapter(new MyViewPagerAdapter(mList));

		imageView1 = (ImageView) findViewById(R.id.imageView1);
		imageView2 = (ImageView) findViewById(R.id.imageView2);
		imageView3 = (ImageView) findViewById(R.id.imageView3);
		imageView4 = (ImageView) findViewById(R.id.imageView4);
		ViewHelper.setScaleX(imageView2, SCALE_MAX);
		ViewHelper.setScaleY(imageView2, SCALE_MAX);
		ViewHelper.setScaleX(imageView3, SCALE_MAX);
		ViewHelper.setScaleY(imageView3, SCALE_MAX);
		ViewHelper.setScaleX(imageView4, SCALE_MAX);
		ViewHelper.setScaleY(imageView4, SCALE_MAX);

		mHashMap.put(0, imageView1);
		mHashMap.put(1, imageView2);
		mHashMap.put(2, imageView3);
		mHashMap.put(3, imageView4);
		mViewPager.setDiyOnPageScrollListener(new DiyPageScrollListener() {

			@Override
			public void diyOnPageScrollListener(int position,
					float positionOffset, int positionOffsetPixels,
					boolean left, boolean right) {

				// 获取左边的View
				ImageView mLeftImg = mHashMap.get(position);
				// 获取右边的View
				ImageView mRightImg = mHashMap.get(position + 1);
				// 判断滑动的方向
				float mScaleRight;
				float mScaleLeft;
				/**
				 * 注意事件: 1 注意你要很灵敏的判断ViewPager的切换方向是很难的,对于要求很高的应用来说是做不到了。 2
				 * 不管是向左滑动还是向右滑动,他们有的都是同一种算法
				 */

				if (mRightImg != null) {
					/**
					 * 缩小比例 如果手指从右到左的滑动(切换到后一个):0.0~1.0,即从一半到最大
					 * 如果手指从左到右的滑动(切换到前一个):1.0~0,即从最大到一半
					 */
					mScaleRight = (1-SCALE_MAX) * positionOffset + SCALE_MAX;
					/**
					 * x偏移量: 如果手指从右到左的滑动(切换到后一个):0-720 如果手指从左到右的滑动(切换到前一个):720-0
					 */
					ViewHelper.setScaleX(mRightImg, mScaleRight);
					ViewHelper.setScaleY(mRightImg, mScaleRight);
				}
				if (mLeftImg != null) {

					mScaleLeft = (1-SCALE_MAX) * (1 - positionOffset) + SCALE_MAX;
					/**
					 * x偏移量: 如果手指从右到左的滑动(切换到后一个):0-720 如果手指从左到右的滑动(切换到前一个):720-0
					 */
					ViewHelper.setScaleX(mLeftImg, mScaleLeft);
					ViewHelper.setScaleY(mLeftImg, mScaleLeft);

				}

			}
		});

	}
}
package com.panpass.adapter;

import java.util.ArrayList;

import android.support.v4.view.PagerAdapter;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;

public class MyViewPagerAdapter extends PagerAdapter {

	private ArrayList<ImageView> imgList;

	public MyViewPagerAdapter(ArrayList<ImageView> imgList) {
		super();
		this.imgList = imgList;
	}

	@Override
	public int getCount() {
		return imgList.size();
	}

	@Override
	public Object instantiateItem(ViewGroup container, int position) {

		ImageView img = imgList.get(position);
		container.addView(img);
		return img;
	}
	@Override
	public void destroyItem(ViewGroup container, int position, Object object) {

		container.removeView((ImageView)object);

	}
	@Override
	public boolean isViewFromObject(View arg0, Object arg1) {
		return arg0 == (View)arg1;
	}

}
package com.panpass.view;

import android.content.Context;
import android.support.v4.view.ViewPager;
import android.util.AttributeSet;

public class MyViewPager extends ViewPager {

	private boolean left = false;
	private boolean right = false;
	private boolean isScrolling = false; 

	private int lastValue = -1;
	private ChangeViewCallback changeViewCallback = null;  

	public MyViewPager(Context context, AttributeSet attrs) {
		super(context, attrs);
		init();
	}  

	public MyViewPager(Context context) {
		super(context);
		init();
	}  

	private DiyPageScrollListener listener1;

	public interface DiyPageScrollListener{

		void diyOnPageScrollListener(int position, float positionOffset,
				int positionOffsetPixels,boolean left,boolean right);
	}

	public void setDiyOnPageScrollListener(DiyPageScrollListener listener){

		this.listener1 = listener;
	}
	@Override
	protected void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
		listener1.diyOnPageScrollListener(position, positionOffset, positionOffsetPixels,left,right);
		super.onPageScrolled(position, positionOffset, positionOffsetPixels);
	}

	/**
	 * init method .
	 */
	private void init() {
//		setOnPageChangeListener(listener);
	}  

	/**
	 * listener ,to get move direction .
	 */
	public  OnPageChangeListener listener = new OnPageChangeListener() {
		@Override
		public void onPageScrollStateChanged(int arg0) {
			if (arg0 == 1) {
				isScrolling = true;
			} else {
				isScrolling = false;
			}  

			if (arg0 == 2) {  

				if(changeViewCallback!=null){
					changeViewCallback.changeView(left, right);
				}
				right = left = false;
			}  

		}  

		@Override
		public void onPageScrolled(int arg0, float arg1, int arg2) {
			if (isScrolling) {
				if (lastValue > arg2) {
					// 递减,向右侧滑动
					right = true;
					left = false;
				} else if (lastValue < arg2) {
					// 递减,向右侧滑动
					right = false;
					left = true;
				} else if (lastValue == arg2) {
					right = left = false;
				}
			}
			lastValue = arg2;
		}  

		@Override
		public void onPageSelected(int arg0) {
			if(changeViewCallback!=null){
				changeViewCallback.getCurrentPageIndex(arg0);
			}
		}
	};  

	/**
	 * 得到是否向右侧滑动
	 * @return true 为右滑动
	 */
	public boolean getMoveRight(){
		return right;
	}  

	/**
	 * 得到是否向左侧滑动
	 * @return true 为左做滑动
	 */
	public boolean getMoveLeft(){
		return left;
	}  

	/**
	 *  滑动状态改变回调
	 * @author zxy
	 *
	 */
	public interface ChangeViewCallback{
		public  void changeView(boolean left,boolean right);
		public  void  getCurrentPageIndex(int index);
	}  

	public void  setChangeViewCallback(ChangeViewCallback callback){
		changeViewCallback = callback;
	}  

}
<RelativeLayout 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" >

    <com.panpass.view.MyViewPager
        android:id="@+id/view_pager"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_centerHorizontal="true"
        android:layout_marginBottom="50dp"
        android:gravity="center" >

        <ImageView
            android:id="@+id/imageView1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@drawable/banner_circle_big" />

        <ImageView
            android:id="@+id/imageView2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="15dp"
            android:src="@drawable/banner_circle_big" />

        <ImageView
            android:id="@+id/imageView3"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="15dp"
            android:src="@drawable/banner_circle_big" />

        <ImageView
            android:id="@+id/imageView4"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="15dp"
            android:src="@drawable/banner_circle_big" />
    </LinearLayout>

</RelativeLayout>

时间: 2024-10-17 11:57:12

Android ViewPager导航------平凡中有奇迹的相关文章

android ViewPager详解

Viewpager 在android界面布局中属于常用类型 ,它可以做导航,页面菜单,进入软件是的欢迎界面 等等.比现在最流行的几款手机软件  ,QQ,微信,微博 等 ,其主界面 都用到了ViewPager,所以学好它,势在必得 ,在这里总结了下, 先用图解 : 这是一个仿微博界面的xml布局 ,他们之间的关系经常搞混淆,怕记不住 ,总结了几句话:ViewPager里面含界面,它的改变控制(title)Imageview的变化,Textview控制页面,并间接控制Title(imageview)

Android ViewPager Fragment使用懒加载提升性能

?? Android ViewPager Fragment使用懒加载提升性能 Fragment在如今的Android开发中越来越普遍,但是当ViewPager结合Fragment时候,由于Android ViewPager内在的加载机制,导致一个比较严重的加载性能问题,具体来说,假设一个ViewPager中有n多个Fragment,那么ViewPager在初始化阶段将一次性的初始化FragmentPagerAdapter中的至少3个Fragment(如果Fragment多于3),创建和加载Fra

Android -- ViewPager、Fragment、状态保存、通信

工程架构                                                                                      TabAFm到TabEFm都是Fragment,并且每个Fragment对应一个布局文件. TabAFm.java                                                                            package com.yydcdut.viewpag

android 底部导航总结

实现android 底部导航的方式有好几种如:fragment:.TabActivity.ViewGroup.viewPager等, 这里介绍使用viewPager实现底部导航. 先说说使用viewPager实现的原因 1.fragment a  我们需要使用fragment的话,我们只能用v4包里面的fragment,因为我们需要向下兼容. b  当我们用V4包里面的fragment的时候,系统会自动添加一个节点. c  fragment不允许嵌套fragmentd  这个谷歌是在4.2里面才

android ViewPager中页面延迟加载的实现

对于viewpager的使用,如果说是请求的数据对内存的消耗不到的话,这是很理想的,但是如果说请求的数据对内存消耗的比较大的话这样就容易出现oom(比如说图片),在使用viewPager的时候使用setOffscreenPageLimit(int size)默认的是1,所以说我们怎么设置这个值,在加载数据的话会将当前页面和下个页面的数据同时的进行请求,这在某种情况下时非常的影响性能的,还有就是在当前页面和下个页面在viewPager中算作了同一个页面,因为你是无法通过生命周期来进行控制数据的延迟

Android——ViewPager+Fragment+ListView之间

Android--ViewPager+Fragment+ListView之间 <span style="font-size:18px;">package com.example.jreduch05; import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v4.view.ViewPager; import android.support.v7.app.A

Android–ViewPager切换动画,PageTransformer

transformPage(View view, float position) view就是滑动中的那个view,position这里是float类型,是当前滑动状态的一个表示,比如当滑动到正全屏时,position是0,如果前一页和下一页基本各在屏幕占一半时,前一页的position是-0.5,后一页的posiotn是0.5(是-0.5还是0.5要看当前的view是前面那一页的view还是后面那一页的),所以根据position的值我们就可以自行设置需要的alpha,x/y信息,就是可以用s

android ViewPager左右滑动翻页,并可以删除page

首先新建一个Activity,继承FragmentActivity. 初始化一个Fragment的List集合,用于像FragmentStatePagerAdapter填充数据,而ViewPager由FragmentStatePagerAdapter的实例进行初始化.和ListView一样,Fragment的List集合的数据变了,就通知FragmentStatePagerAdapter进行界面刷新. ArrayList<Fragment> fragments =new ArrayList&l

Android车载导航的一些困境

车载导航从最初的用解码芯片,过渡到用WinCE系统,已经形成了一个较大的产业.车载导航使用上的一些大原则,基本上被固定了下来.现在WinCE走到了尽头,Android车载导航开始发力,但因为Android系统的使用习惯,与传统车载的使用习惯有着较大的不同,在设计的时候,往往会遇到一些尴尬,既要保持原有的使用习惯,又要保留Android的优点.都要兼顾的话往往是技术上要费很大功夫而且带来使用上的困惑,但是市场的惯性又很难允许全面的革新.所以Android车载,我认为最大的困难并不是技术上的,而是产