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\v4android-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 的自定义动画的主要内容,如果未能解决你的问题,请参考以下文章

Xamarin.forms 页面之间导航的自定义动画?

SceneKit 中的自定义动画属性

DragonBones龙骨骨骼中的自定义事件(另有声音动画事件)

UICollectionView 上的自定义动画重新加载数据

UICollectionViewFlowLayout 中的自定义动画 - 水平滚动方向

动画边界更改时具有 CALayer 有线效果的自定义视图