viewpager 的自定义动画
Posted
技术标签:
【中文标题】viewpager 的自定义动画【英文标题】:Custom animation for viewpager 【发布时间】:2013-03-06 02:56:25 【问题描述】:我正在使用 viewPager 和 Fragments,现在我正在尝试获取自定义动画,确切地说是 zoom-out page transformation。
但是我遇到了一些错误。我会用代码 sn-p 将错误放在注释中。
类 MainActivity
import android.support.v4.app.FragmentManager;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.support.v4.view.ViewPager;
import android.view.Menu;
public class MainActivity extends FragmentActivity
@Override
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);/** Getting a reference to the ViewPager defined the layout file */
ViewPager pager = (ViewPager) findViewById(R.id.pager);
/** Getting fragment manager */
FragmentManager fm = getSupportFragmentManager();
/** Instantiating FragmentPagerAdapter */
MyFragmentPagerAdapter pagerAdapter = new MyFragmentPagerAdapter(fm);
/** Setting the pagerAdapter to the pager object */
pager.setAdapter(pagerAdapter);
// **ERROR:The method setPageTransformer(boolean, ViewPager.PageTransformer) in the type ViewPager is not applicable for the arguments (boolean, ZoomOutPageTransformer)**
pager.setPageTransformer(true, new ZoomOutPageTransformer());
@Override
public boolean onCreateOptionsMenu(Menu menu)
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
类 ZoomOutPageTransformer
import android.view.View;
// **ERROR on 'ViewPager.PageTransformer --> ViewPager cannot be resolved to a type **
public class ZoomOutPageTransformer implements ViewPager.PageTransformer
private static float MIN_SCALE = 0.85f;
private static float MIN_ALPHA = 0.5f;
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);
【问题讨论】:
你在声明ZoomOutPageTransformer
的文件中是否导入了ViewPager.PageTransformer
接口?
代码 sn-p 是我所拥有的,我还使用了快捷键 'ctrl+shift+o' 来获得所有正确的导入。所以我想我有所有需要的进口。
ZoomOutPageTransformer
文件中有import android.support.v4.view.ViewPager.PageTransformer;
吗?如果没有,你应该拥有它。
我有它,但我仍然遇到同样的错误。我什至清理了项目。
我有,但是说没用??
【参考方案1】:
我已经解决了这个问题:
-
下载最新Android SDK
浏览到 android-sdk-windows\extras\android\support\v4
将 android-support-v4.jar 复制到项目中的 libs 文件夹中
清理您的项目
运行您的代码
这对我有用,通过 ecplise 下载支持库给了我这个错误。这解决了我的问题
【讨论】:
【参考方案2】:@mXX 几乎是对的。但是对于那些仍然有问题的人(比如我),我需要在他的程序中添加一个点。
您需要更新您的 Android 支持库包。 但如果您现在拥有它,则需要先将其卸载,然后重新安装才能获得新的。
如果你有 IntellijIdea:
-
从“工具/Android/SDK 管理器”打开 SDK 管理器窗口
找到 Exteras 文件夹然后检查 Android 支持库。如果它的状态是
安装后单击“删除 1 个包...”以将其删除。
检查此软件包并单击安装按钮。
导航到 \extras\android\support\v4 然后复制
android-support-v4.jar 并将其粘贴到您的 Libs 文件夹中。
Idea 应该自动重新编译项目,但是如果它没有这样做
那么你应该通过点击手动重新编译它
“构建/重建项目”
就是这样;)
【讨论】:
【参考方案3】:对于仍然坚持这一点的当前支持 v4 问题,不导入 v4 ViewPager 接口:它不需要静态 ViewPager 类实例。只需实现 PageTransformer。 PageTransformer 接口已经用 ViewPager 封装在里面了。
public class ZoomOutPageTransformer implements PageTransformer
private static float MIN_SCALE = 0.85f;
private static float MIN_ALPHA = 0.5f;
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);
【讨论】:
设置view.setAlpha(0);
给我带来了一个错误,我花了一天时间才发现它。如果我在 Tablayout 中单击选项卡,页面总是空白,或者如果我刷得更快,一些页面显示为空白。【参考方案4】:
更新 android support v4 库后,您可以从 eclipse 中删除该项目。 然后再次导入项目。做干净的构建,一切都会好的!
【讨论】:
我应该删除我的项目吗?你是什么意思更新支持v4库?我该怎么做?【参考方案5】:只需将 compile 'com.android.support:support-v13:23.1.1' 添加到 build.gradle 中的 dependencies(@ 987654321@)
【讨论】:
以上是关于viewpager 的自定义动画的主要内容,如果未能解决你的问题,请参考以下文章
DragonBones龙骨骨骼中的自定义事件(另有声音动画事件)
UICollectionView 上的自定义动画重新加载数据