图像幻灯片显示在旋转木马风格上Xamarin.Android与ViewPager和填充与突出的儿童,Viewpages不

本文关键字:填充 Viewpages ViewPager 显示 幻灯片 旋转木马 风格 Android Xamarin 图像 | 更新日期: 2023-09-27 18:17:04

我尝试创建一个图像幻灯片与ViewPager和填充以下教程:http://blog.neteril.org/blog/2013/10/14/android-tip-viewpager-with-protruding-children/
我在试着转换Xamarin的代码。Android代码和我卡住了一个小细节:

var pager = view.FindViewById<ViewPager> (Resource.Id.pager);
pager.SetClipToPadding (false);
pager.PageMargin = 12.ToPixels ();
pager.Adapter = new MyPageAdapter (ChildFragmentManager);
class MyPageAdapter : FragmentStatePagerAdapter
{
public override float GetPageWidth (int position)
{
    return 0.93f;
}
// ...
}

Xamarin没有。ToPixels() ,这个ToPixels()做什么?它在把dp转换成像素?

此外,我正在使用ViewPager与填充(窥视内容)。

根据javadoc, transformPage函数有一个"position"参数:页的位置,相对于当前页的前端和中心位置。0在前面和中间。1是右边的一个整页位置,-1是左边的一个页面位置。"

不幸的是,ViewPager计算"位置"参数不正确,如果ViewPager包含填充。我正在使用这个Transformer:

class WheelPageTransformer : Java.Lang.Object, ViewPager.IPageTransformer
{
private const float MaxAngle = 30F;
public void TransformPage(View view, float position)
{
if (position < -1 || position > 1) 
{
view.Alpha = 0; // The view is offscreen.
} 
else
    {
view.Alpha = 1; 
view.PivotY = view.Height / 2; // The Y Pivot is halfway down the view.
// The X pivots need to be on adjacent sides.
        if (position < 0)
        {
            view.PivotX = view.Width;
        }
        else
        {
            view.PivotX = 0;
        }
        view.RotationY = MaxAngle * position; // Rotate the view.
    }
 }
 }

,我认为这纠正了我的问题,但我不能转换它为我的情况https://code.google.com/p/android/issues/detail?id=64046

图像幻灯片显示在旋转木马风格上Xamarin.Android与ViewPager和填充与突出的儿童,Viewpages不

这个ToPixel()只是一个定制的扩展方法,可以将任何int值转换为缩放像素值。请参阅下面的代码片段:

public static class PixelExtensions
{
    public static int ToPixel(this int val)
    {
        float scale = Application.Context.Resources.DisplayMetrics.Density;
        int pixels = (int)(val * scale + 0.5f);
        return pixels;
    }
    public static int ToSizeUnit(ComplexUnitType toUnit, int value)
    {
        return Convert.ToInt32(TypedValue.ApplyDimension(toUnit, value, Application.Context.Resources.DisplayMetrics));
    }
}

它有两个方法,一个ToPixel()是一个扩展方法,帮助您将任何int值转换为像素。另一个ToSizeUnit()是一种通用的,你可以使用任何预期或可用的大小单位。

  1. ToPixel ()

    viewPager.PageMargin = 12.ToPixel();
    
  2. ToSizeUnit ()

    viewPager.PageMargin = PixelExtensions.ToSizeUnit(ComplexUnitType.Px,12);
    //It can be ComplexUnitType.Dip or more :)
    

编辑:更新第二个问题的答案,即转换代码。

您提供的链接代码转换如下所示:

 public abstract class FixedPageTransformer : ViewPager.IPageTransformer
 {
    ViewPager mPager;
    int mClientWidth, mPaddingLeft;
    public FixedPageTransformer(ViewPager pager)
    {
        this.mPager = pager;
        mClientWidth = mPager.MeasuredWidth - mPager.PaddingLeft - mPager.PaddingRight;
        mPaddingLeft = mPager.PaddingLeft;
    }
    public void TransformPage(View view, float v)
    {
        FixedTransformPage(view, (float)(view.Left - (mPager.ScrollX + mPaddingLeft)) / mClientWidth);
    }
    public abstract void FixedTransformPage(View view, float fixedVal);
 }
public class WheelPageTransformer : FixedPageTransformer
{
    public WheelPageTransformer(ViewPager yourViewPager):base(yourViewPager)
    {
    }
    public override void FixedTransformPage(View view, float fixedVal)
    {
        int pageWidth = view.Width;
        ViewPager parent = (ViewPager)view.Parent;
        fixedVal -= parent.PaddingRight / (float)pageWidth;
        //Your transformation with the new position.
    }
}

干杯! !

RIYAZ

为我工作的正确FixedPageTransformer类是:

public abstract class FixedPageTransformer : Java.Lang.Object, ViewPager.IPageTransformer
{
    ViewPager mPager;
    int mClientWidth, mPaddingLeft;
    public FixedPageTransformer(ViewPager pager)
    {
        this.mPager = pager;
        mClientWidth = mPager.Width - mPager.PaddingLeft - mPager.PaddingRight;
        mPaddingLeft = mPager.PaddingLeft / 2;
    }
    public void TransformPage(View view, float v)
    {
        FixedTransformPage(view, (float)(view.Left - (mPager.ScrollX + mPaddingLeft)) / mClientWidth);
    }
    public abstract void FixedTransformPage(View view, float fixedVal);
}
public class WheelPageTransformer : FixedPageTransformer
{
    public WheelPageTransformer(ViewPager yourViewPager):base(yourViewPager)     { }
    public override void FixedTransformPage(View view, float fixedVal)
    {
        int pageWidth = view.Width;
        ViewGroup parent = (ViewGroup)view.Parent;
        fixedVal -= (parent.PaddingRight / 2) / (float)pageWidth;
        //Your transformation with the new position.
        const float MaxAngle = 30F;
        if (fixedVal < -1 || fixedVal > 1) {
            view.Alpha = 0; // The view is offscreen.
        } else {
            view.Alpha = 1; 
            view.PivotY = view.Height / 2; // The Y Pivot is halfway down the view.
            // The X pivots need to be on adjacent sides.
            if (fixedVal < 0) {
                view.PivotX = view.Width;
            } else {
                view.PivotX = 0;
            }
            view.RotationY = MaxAngle * fixedVal; // Rotate the view.
        }
    }
}

我没有添加页边距,也没有重写pageWidth。