How to construct custom views in xamarin

21,861

Solution 1

I would suggest checking out this Java Android tutorial to get an idea of what you need to setup:

http://developer.android.com/training/custom-views/index.html

You may need to create an attributes xml file for your custom view.

Another approach you may want to consider is to use a fragment instead of a view:

http://docs.xamarin.com/guides/android/platform_features/fragments/fragments_walkthrough

Solution 2

In the layout file you need to write the path to your class in small letters. For me Core.Droid.MyImageView had to be written as core.droid.MyImageView.

I am not sure if only the first letter or all letter have to be written in small, but you can try either lA_Application.ZoomView or la_application.ZoomView. One of them will very likely work :)

Solution 3

Here is the skeleton of how to create a custom view in xamarin.android

http://xandroid4net.blogspot.com/2014/09/custom-view.html

Then take Emmanuel Touzery answer and add it to the skeleton

android pinch zoom

Share:
21,861
Cris
Author by

Cris

Updated on July 09, 2022

Comments

  • Cris
    Cris almost 2 years

    Is there any tutorial which will enable me to design custom views in xamarin?I want to build pinch zoom functionality for my android app using xamarin.

    I have tried following code,but its not working,I am always getting android.view.InflateException: Binary XML file line #1: Error inflating class LA_Application.ZoomView error

    using System;    
    using System.Collections.Generic;
    using System.Linq;    
    using System.Text;    
    using Android.App;    
    using Android.Content;    
    using Android.OS;    
    using Android.Runtime;    
    using Android.Util;    
    using Android.Views;    
    using Android.Widget;    
    using Android.Graphics;
    
    namespace LA_Application    
    {
    
        public class ZoomView : FrameLayout      
        {
    
            private ScaleGestureDetector mScaleDetector;    
            private static float mScaleFactor = 1.0f;   
    
    
            public ZoomView (Context context) : base (context)
            {
                Initialize ();    
            }
    
            public ZoomView (Context context, IAttributeSet attrs) : base (context,attrs)    
            {
                Initialize ();    
            }
    
            public ZoomView (Context context, IAttributeSet attrs, int defStyle) : base (context, attrs, defStyle)
            {
                Initialize ();
            }
    
            void Initialize ()
            {
                mScaleDetector = new ScaleGestureDetector(Context, new ScaleListener());
            }
    
            public override bool OnTouchEvent (MotionEvent e)
            {
                mScaleDetector.OnTouchEvent(e);
    
                return true;
            }
    
            protected override void OnDraw(Android.Graphics.Canvas canvas)
            {
                base.OnDraw(canvas);
    
                canvas.Save();    
                canvas.Scale(mScaleFactor, mScaleFactor);
                canvas.Restore();
            }
        }
    
        private class ScaleListener : ScaleGestureDetector.SimpleOnScaleGestureListener
        {
            public override bool OnScale(ScaleGestureDetector detector)
            {
                mScaleFactor *= detector.ScaleFactor;
    
                // Don't let the object get too small or too large.
                mScaleFactor = Math.Max(0.1f, Math.Min(mScaleFactor, 5.0f));
    
                return true;
            }  
        }
    }
    

    }

    and in layout file

    <?xml version="1.0" encoding="utf-8"?>
    <LA_Application.ZoomView xmlns:android="http://schemas.android.com/apk/res/android"
                             android:layout_width="match_parent"
                             android:layout_height="match_parent"
                             android:id="@+id/my_view" />
    

    activity code

    protected override void OnCreate (Bundle bundle)
    {
        base.OnCreate (bundle);
    
        SetContentView(Resource.Layout.zoomview);
    
        /*some code*/
    }