java - 使用 ViewPager 在 Xamarin.Android 上以轮播样式显示图像幻灯片并使用突出的子项进行填充,Viewpager 错误地计算参数

标签 java c# android xamarin

我正在尝试按照本教程使用 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 会错误地计算“位置”参数。 我正在使用这个变压器:

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

最佳答案

这个ToPixel()不仅仅是一个自定义的扩展方法,用于将任何 int 值转换为缩放像素值。请参阅下面的代码 fragment :

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.
    }
}

干杯!!

里亚兹

关于java - 使用 ViewPager 在 Xamarin.Android 上以轮播样式显示图像幻灯片并使用突出的子项进行填充,Viewpager 错误地计算参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33048073/

相关文章:

java - Spring MVC 3.2 Jackson 错误请求

android - 性能方面,什么更好 : AsyncTask or simply create a runnable?

java - setMargins() 不起作用 - Android

java - 了解以毫秒为单位的 XMLGregorianCalendar/GregorianCalendar 时间

java - 使用 Jena 读取 Turtle 中带空格的 URI?

java - 如何动态构建jtree

c# - 我应该迁移到 Entity Framework 吗?

c# - 如何写入资源文件?

c# - 无法仅在 Windows Phone 上读取具有值的 json 数组

android - 分页库 : How to reload portion of data on demand?