gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 11:04:59 25 4
gpt4 key购买 nike

我正在尝试按照本教程使用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com