当前位置: 首页 > news >正文

千变万化的ViewPager切换动画(1)--仅支持3.0以上版本的官方方法

(1)创建一个项目Viewpager_anim 添加图片资源guide_image1.png、guide_image2.png、guide_image3.png


编写activity_main.xml

<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"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >

    <!-- ctrl+shitf+t 可以找到viewpager的包名 -->

    <android.support.v4.view.ViewPager
        android:id="@+id/id_viewpager"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent" >
    </android.support.v4.view.ViewPager>

</RelativeLayout>
编写MainActivity.java

package com.lc.viewpager_anim;

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

import android.os.Bundle;
import android.app.Activity;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.widget.ImageView;
import android.widget.ImageView.ScaleType;

public class MainActivity extends Activity {

	private ViewPager mViewPager;
	private int[] mImgIds = new int[] { R.drawable.guide_image1,
			R.drawable.guide_image2, R.drawable.guide_image3 };

	private List<ImageView> mImages = new ArrayList<ImageView>();

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		requestWindowFeature(Window.FEATURE_NO_TITLE);
		setContentView(R.layout.activity_main);

		mViewPager = (ViewPager) findViewById(R.id.id_viewpager);
		/*
		 * 为viewpager添加动画效果
		 */
		// 1.第一种动画效果
		// mViewPager.setPageTransformer(true, new DepthPageTransformer());

		// 2.第二种动画效果
		// mViewPager.setPageTransformer(true, new ZoomOutPageTransformer());

		// 3.第三种动画效果:旋转的动画效果
		mViewPager.setPageTransformer(true, new RotateDownPageTransformer());
		// 添加适配器
		mViewPager.setAdapter(new PagerAdapter() {

			/**
			 * 初始化代码
			 */
			@Override
			public Object instantiateItem(ViewGroup container, int position) {
				ImageView imageView = new ImageView(MainActivity.this);
				imageView.setImageResource(mImgIds[position]);
				imageView.setScaleType(ScaleType.CENTER_CROP);// 设置图片的形状防止变形
				container.addView(imageView);
				mImages.add(imageView);
				return imageView;
			}

			@Override
			public void destroyItem(ViewGroup container, int position,
					Object object) {
				container.removeView(mImages.get(position));
			}

			@Override
			public boolean isViewFromObject(View view, Object object) {
				return view == object;
			}

			@Override
			public int getCount() {
				return mImgIds.length;
			}
		});
	}

}


ZoomOutPageTransformer.java和DepthPageTransformer是android自己提供的两个动画,是在sdk--doc目录下的/sdk/docs/training/animation/screen-slide.html找到的,


ZoomOutPageTransformer.java(从文档中粘贴过来的时候可能有一些错误,只需要修改一下即可)

package com.lc.viewpager_anim;

import android.annotation.SuppressLint;
import android.support.v4.view.ViewPager;
import android.view.View;

public class ZoomOutPageTransformer implements ViewPager.PageTransformer {
	private static float MIN_SCALE = 0.85f;
	private static float MIN_ALPHA = 0.5f;

	@SuppressLint("NewApi")
	public void transformPage(View view, float position) {
		int pageWidth = view.getWidth();
		int pageHeight = view.getHeight();

		if (position < -1) { // [-Infinity,-1)
			// This page is way off-screen to the left.
			view.setAlpha(0);

		} else if (position <= 1) { // [-1,1]
			// Modify the default slide transition to shrink the page as well
			float scaleFactor = Math.max(MIN_SCALE, 1 - Math.abs(position));
			float vertMargin = pageHeight * (1 - scaleFactor) / 2;
			float horzMargin = pageWidth * (1 - scaleFactor) / 2;
			if (position < 0) {
				view.setTranslationX(horzMargin - vertMargin / 2);
			} else {
				view.setTranslationX(-horzMargin + vertMargin / 2);
			}

			// Scale the page down (between MIN_SCALE and 1)
			view.setScaleX(scaleFactor);
			view.setScaleY(scaleFactor);

			// Fade the page relative to its size.
			view.setAlpha(MIN_ALPHA + (scaleFactor - MIN_SCALE)
					/ (1 - MIN_SCALE) * (1 - MIN_ALPHA));

		} else { // (1,+Infinity]
			// This page is way off-screen to the right.
			view.setAlpha(0);
		}
	}
}

DepthPageTransformer

package com.lc.viewpager_anim;

import android.annotation.SuppressLint;
import android.support.v4.view.ViewPager;
import android.view.View;

/*
 * 这里的动画效果只有在3.0以上有效果
 */
public class DepthPageTransformer implements ViewPager.PageTransformer {
	private static float MIN_SCALE = 0.75f;

	@SuppressLint("NewApi")
	public void transformPage(View view, float position) {
		int pageWidth = view.getWidth();

		if (position < -1) { // [-Infinity,-1)
			// This page is way off-screen to the left.
			view.setAlpha(0);

		} else if (position <= 0) { // [-1,0]
			// Use the default slide transition when moving to the left page
			view.setAlpha(1);
			view.setTranslationX(0);
			view.setScaleX(1);
			view.setScaleY(1);

		} else if (position <= 1) { // (0,1]
			// Fade the page out.
			view.setAlpha(1 - position);

			// Counteract the default slide transition
			view.setTranslationX(pageWidth * -position);

			// Scale the page down (between MIN_SCALE and 1)
			float scaleFactor = MIN_SCALE + (1 - MIN_SCALE)
					* (1 - Math.abs(position));
			view.setScaleX(scaleFactor);
			view.setScaleY(scaleFactor);

		} else { // (1,+Infinity]
			// This page is way off-screen to the right.
			view.setAlpha(0);
		}
	}
}

RotateDownPageTransformer.java

package com.lc.viewpager_anim;

import android.annotation.SuppressLint;
import android.support.v4.view.ViewPager;
import android.view.View;

/*
 * 设置一个左右旋转的动画效果
 * 
 */
public class RotateDownPageTransformer implements ViewPager.PageTransformer {

	private static float MAX_ROTATE = 20f;// 设置动画旋转的角度
	private float mRot;

	// A页角度变化0·20;B页角度变化20·0

	@SuppressLint("NewApi")
	public void transformPage(View view, float position) {
		int pageWidth = view.getWidth();

		if (position < -1) { // [-Infinity,-1) 当前View不可见的时候

			view.setRotation(0); // 不让他旋转

		} else if (position <= 0) { // [-1,0] A页

			mRot = position * MAX_ROTATE; // 0`20

			view.setPivotX(pageWidth / 2); // 宽度
			view.setPivotY(view.getMeasuredHeight());// 高度

			view.setRotation(mRot);

		} else if (position <= 1) { // (0,1] B页

			mRot = position * MAX_ROTATE; // 20`2

			view.setPivotX(pageWidth / 2); // 宽度
			view.setPivotY(view.getMeasuredHeight());// 高度

			view.setRotation(mRot);

		} else { // (1,+Infinity]
			view.setRotation(0); // 不让他旋转
		}
	}
}


完整项目下载地址: http://download.csdn.net/detail/u010870518/8468619


相关文章:

  • Canopy聚类算法与Mahout中的实现
  • Android基础学习—下载并在Eclipse中关联Android源码
  • 【html】【11】函数名称约束规范
  • 千变万化的ViewPager切换动画(2)--自定义ViewPager的实现方法
  • 二叉树习题之重建二叉树
  • WebView的简单入门
  • 持续集成
  • Android开发Eclipse连接真机
  • 吐槽贴-微信公众号那些让人想起神兽的坑
  • No orientation specified, and the default is horizontal.
  • Java代码实现随机生成汉字
  • (转)负载均衡,回话保持,cookie
  • js跨域及解决方案
  • Daily Scrumming* 2015.12.13(Day 5)
  • WebApp之JQuery Mobile实现火车列表信息查询
  • 03Go 类型总结
  • 2018一半小结一波
  • 4月23日世界读书日 网络营销论坛推荐《正在爆发的营销革命》
  • const let
  • GitUp, 你不可错过的秀外慧中的git工具
  • Hibernate最全面试题
  • js操作时间(持续更新)
  • js递归,无限分级树形折叠菜单
  • leetcode讲解--894. All Possible Full Binary Trees
  • MySQL常见的两种存储引擎:MyISAM与InnoDB的爱恨情仇
  • php ci框架整合银盛支付
  • PHP 程序员也能做的 Java 开发 30分钟使用 netty 轻松打造一个高性能 websocket 服务...
  • 阿里云Kubernetes容器服务上体验Knative
  • 基于组件的设计工作流与界面抽象
  • 记录一下第一次使用npm
  • 将 Measurements 和 Units 应用到物理学
  • 深入浅出webpack学习(1)--核心概念
  • 我感觉这是史上最牛的防sql注入方法类
  • 异常机制详解
  • 源码安装memcached和php memcache扩展
  • C# - 为值类型重定义相等性
  • Spark2.4.0源码分析之WorldCount 默认shuffling并行度为200(九) ...
  • 浅谈sql中的in与not in,exists与not exists的区别
  • ​HTTP与HTTPS:网络通信的安全卫士
  • ​MySQL主从复制一致性检测
  • ​TypeScript都不会用,也敢说会前端?
  • # 安徽锐锋科技IDMS系统简介
  • #### go map 底层结构 ####
  • #define,static,const,三种常量的区别
  • #Lua:Lua调用C++生成的DLL库
  • #预处理和函数的对比以及条件编译
  • (env: Windows,mp,1.06.2308310; lib: 3.2.4) uniapp微信小程序
  • (NO.00004)iOS实现打砖块游戏(九):游戏中小球与反弹棒的碰撞
  • (附源码)springboot掌上博客系统 毕业设计063131
  • (六)软件测试分工
  • (免费领源码)Java#Springboot#mysql农产品销售管理系统47627-计算机毕业设计项目选题推荐
  • (十六)串口UART
  • (原創) 如何將struct塞進vector? (C/C++) (STL)
  • (原創) 未来三学期想要修的课 (日記)
  • ***检测工具之RKHunter AIDE