2012-03-09 2 views
1

Доступен ли ViewPager для разработчиков monodroid? Я видел много учебников, как этот для Android: http://android-developers.blogspot.com/2011/08/horizontal-view-swiping-with-viewpager.htmlMonodroid ViewPager

Я могу сделать это и объявить ViewPager как код, например:

using Android.Support.V4.Widget; 

namespace ViewPagerTest 
{ 
    [Activity(Label = "ViewPager", MainLauncher = true, Icon = "@drawable/icon")] 
    public class Activity1 : Activity 
    { 
     int count = 1; 

     protected override void OnCreate(Bundle bundle) 
     { 
      base.OnCreate(bundle); 

      ViewPager pager = new ViewPager(this); 

      SetContentView(Resource.Layout.Main); 

     } 
    } 
} 

Но в учебнике он использует XML-код, такой как это:

<android.support.v4.view.ViewPager 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     /> 

Какой Monodroid не кажется, нравится .. Любой вход, что я не хватает?

+0

Как вы получаете класс ViewPager? какую библиотеку вы используете? – Matthew

+0

с помощью Android.Support.V4.Widget –

+0

Вопрос в том, как вы получаете этот класс от C#/Mono? Существует ли оболочка, которую вы используете, поскольку нет версии C# для пространства имен Android.Support – Matthew

ответ

4

Не является прямым ответом на ваш вопрос ...

Но кто-то портирован отдельный ViewPager к MonoDroid: https://github.com/Cheesebaron/MonoDroid.HorizontalPager

И я тогда добавил простой индикатор страницы на основе http://buildmobile.com/how-to-build-an-android-pager-component/#fbid=TnZmgHdBfhF

// original credit to: 
// https://github.com/brucejcooper/Android-Examples/blob/master/PagingScrollerExample/src/com/eightbitcloud/pagingscroller/PageIndicator.java 
public class HorizontalPagerIndicator : View 
{ 
    private HorizontalPager _pager; 
    private Paint _textPaint; 
    private Paint _inactiveDotPaint; 
    private Paint _dotPaint; 
    private Paint _dotBackgroundPaint; 
    private int _textHeight; 
    private int _ascent; 
    private int _cellSize; 
    private float _displayDensity; 

    public HorizontalPagerIndicator(Context context, IAttributeSet attrs) 
     : base(context, attrs) 
    { 
     InitPaints(context); 
    } 


    public HorizontalPagerIndicator(Context context) 
     : base(context) 
    { 
     InitPaints(context); 
    } 

    private void InitPaints(Context context) 
    { 
     _displayDensity = context.Resources.DisplayMetrics.Density; 

     _textPaint = new Paint {AntiAlias = true, TextSize = DeviceIndependentToPixels(14), Color = Color.Black}; 

     _inactiveDotPaint = new Paint { AntiAlias = true, Color = Color.Gray }; 
     _dotPaint = new Paint {AntiAlias = true, Color = Color.White}; 
     _dotBackgroundPaint = new Paint { AntiAlias = true, Color = Color.Cyan }; 

     _ascent = -(int)_textPaint.Ascent(); 
     _textHeight = (int)(_ascent + _textPaint.Descent()); 
     _cellSize = DeviceIndependentToPixels(_textHeight + 6); 
    } 


    public HorizontalPager Pager 
    { 
     get { return _pager; } 
     set { 

      if (_pager != null) 
      { 
       _pager.ScreenChanged -= PagerOnScreenChanged; 
      } 
      _pager = value; 
      if (_pager != null) 
      { 
       _pager.ScreenChanged += PagerOnScreenChanged; 
      } 
      UpdatePageCount(); 
     } 
    } 

    private void PagerOnScreenChanged(object sender, EventArgs eventArgs) 
    { 
     Invalidate(); 
    } 

    public void UpdatePageCount() 
    { 
     RequestLayout(); 
     Invalidate(); 
    } 

    private int NumPages 
    { 
     get 
     { 
      return _pager == null ? 1 : _pager.ChildCount; 
     } 
    } 

    private int ActivePage 
    { 
     get 
     { 
      return _pager == null ? 0 : _pager.CurrentScreen; 
     } 
    } 

    protected override void OnMeasure(int widthMeasureSpec, int heightMeasureSpec) 
    { 
     SetMeasuredDimension(MeasureWidth(widthMeasureSpec), MeasureHeight(heightMeasureSpec)); 
    } 

    private int MeasureWidth(int measureSpec) 
    { 
     var result = 0; 
     var specMode = MeasureSpec.GetMode(measureSpec); 
     var specSize = MeasureSpec.GetSize(measureSpec); 

     if (specMode == MeasureSpecMode.Exactly) 
     { 
      // We were told how big to be 
      result = specSize; 
     } 
     else 
     { 
      result = NumPages * _cellSize; 
      if (specMode == MeasureSpecMode.AtMost) 
      { 
       // Respect AT_MOST value if that was what is called for by 
       // measureSpec 
       result = Math.Min(result, specSize); 
      } 
     } 
     return result; 
    } 

    private int MeasureHeight(int measureSpec) 
    { 
     var result = 0; 
     var specMode = MeasureSpec.GetMode(measureSpec); 
     var specSize = MeasureSpec.GetSize(measureSpec); 


     if (specMode == MeasureSpecMode.Exactly) 
     { 
      // We were told how big to be 
      result = specSize; 
     } 
     else 
     { 
      result = _cellSize; 
      if (specMode == MeasureSpecMode.AtMost) 
      { 
       // Respect AT_MOST value if that was what is called for by 
       // measureSpec 
       result = Math.Min(result, specSize); 
      } 
     } 
     return result; 
    } 

    protected override void OnDraw(Canvas canvas) 
    { 
     base.OnDraw(canvas); 

     var numPages = NumPages; 
     var activePageIndex = ActivePage; 

     var x = (canvas.Width - numPages * _cellSize)/2; 

     //var smallBorder = _cellSize/4; 
     //var slightlySmallerBorder = smallBorder - 1; 
     var emptyDotSize = _cellSize/4; 
     var dotOffset = (_cellSize - emptyDotSize)/2; 
     for (var i = 0; i < numPages; i++, x += _cellSize) 
     { 
      if (i == activePageIndex) 
      { 
       //var txt = (i + 1).ToString(System.Globalization.CultureInfo.CurrentUICulture); 
       //var bounds = new Rect(); 
       //_textPaint.GetTextBounds(txt, 0, txt.Length, bounds); 
       //var oval = new RectF(x + smallBorder, smallBorder, x + _cellSize - smallBorder, _cellSize - smallBorder); 
       var oval = new RectF(x + dotOffset, dotOffset, x + dotOffset + emptyDotSize, dotOffset + emptyDotSize); 
       var oval1 = new RectF(x + dotOffset - 1, dotOffset - 1, x + dotOffset + emptyDotSize + 1, dotOffset + emptyDotSize + 1); 
       canvas.DrawOval(oval1, _dotBackgroundPaint); 
       canvas.DrawOval(oval, _dotPaint); 
       //canvas.DrawText(txt, x + (_cellSize - bounds.Width())/2, (_cellSize - _textHeight)/2 + _ascent, _textPaint); 
      } 
      else 
      { 
       var oval = new RectF(x + dotOffset, dotOffset, x + dotOffset + emptyDotSize, dotOffset + emptyDotSize); 
       canvas.DrawOval(oval, _inactiveDotPaint); 
      } 
     } 
    } 

    private int DeviceIndependentToPixels(int dpi) 
    { 
     return (int)Math.Round((float)dpi * _displayDensity); 
    } 
} 

В один прекрасный день я получу образец проекта в GitHub!

+0

Хотя это не отвечает на мой вопрос, это вроде бы все равно. Не похоже, что Monodroid поддерживает ViewPager, но это приводит к таким решениям. Я также использую этот, но он находится под лицензией Apache. Как это повлияет на мое приложение, которое будет запущено на рынке? –

+0

Я думаю, что Apache довольно разрешительный - http://en.wikipedia.org/wiki/Apache_License – Stuart

+0

Я полностью 100% рекомендую HorizontalPager от CheeseBaron. В настоящее время я использую MonoCross, который до сих пор не поддерживает фрагменты, и я слишком инвестирован, чтобы вернуться назад. Спасибо тонну за это предложение Стюарта (и CheeseBaron!). – samosaris

2

Даже это уже ответил:

Его можно с Опорно-пакетов.

Я только что внедрил его после this Java example.

Вы можете просто передать все, что там написано на C# код, Есть только несколько вещей, чтобы заботиться о:

  • также материал закомментирована должен быть использован
  • Dont называть класс PagerAdapter
  • когда автор писал super.anything() использования base.Anything()
  • при инстанцировании фрагментов, убедитесь, что и написать имяпакет в нижнем регистре.

Надеюсь, это поможет кому угодно.