图像幻灯片显示在旋转木马风格上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
这个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()是一种通用的,你可以使用任何预期或可用的大小单位。
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.
}
}
干杯! !
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。