我正在尝试按照本教程使用 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() 是一种通用的,您可以将其用于任何预期或可用的尺寸单位。
ToPixel()
viewPager.PageMargin = 12.ToPixel();
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/