Нужен способ добавить кнопку к этому образцу Android Xamarin - PullRequest
0 голосов
/ 08 июня 2018

Я использовал этот образец здесь: https://github.com/xamarin/xamarin-forms-samples/blob/master/CustomRenderers/View/Droid/CameraPreview.cs

, чтобы получить видео с камеры для моего проекта.Что касается IOS, я легко добавил кнопку съемки на канал камеры.Я пытаюсь сделать то же самое здесь, на стороне Android, но я не могу найти способ, как это сделать ... Все, что я пытался сделать пустую страницу или выдать ошибку.

Какой самый простой способдобавить кнопку на эту камеру?Заранее спасибо

Ответы [ 2 ]

0 голосов
/ 27 мая 2019

Это сработало для меня.В классе CameraPreview просто добавьте новый элемент View (cameraLayoutView) и кнопку:

public sealed class CameraPreview : ViewGroup, ISurfaceHolderCallback
{
    View cameraLayoutView;
    global::Android.Widget.Button takePhotoButton;
}

Затем в конструкторе создайте экземпляр этого представления и кнопку:

public CameraPreview (Context context)
            : base (context)
{
    surfaceView = new SurfaceView (context);
    AddView (surfaceView);

    Activity activity = this.Context as Activity;
    cameraLayoutView = activity.LayoutInflater.Inflate(Resource.Layout.CameraLayout, this, false);
    AddView(cameraLayoutView);

    takePhotoButton = this.FindViewById<global::Android.Widget.Button>(Resource.Id.takePhotoButton);
    takePhotoButton.Click += TakePhotoButtonTapped;

    windowManager = Context.GetSystemService (Context.WindowService).JavaCast<IWindowManager> ();

    IsPreviewing = false;
    holder = surfaceView.Holder;
    holder.AddCallback (this);
}

async void TakePhotoButtonTapped(object sender, EventArgs e)
{
       //handle the click here    
}

protected override void OnLayout (bool changed, int l, int t, int r, int b)
{
    var msw = MeasureSpec.MakeMeasureSpec (r - l, MeasureSpecMode.Exactly);
    var msh = MeasureSpec.MakeMeasureSpec (b - t, MeasureSpecMode.Exactly);

    surfaceView.Measure (msw, msh);
    surfaceView.Layout (0, 0, r - l, b - t);

    cameraLayoutView.Measure(msw, msh);
    cameraLayoutView.Layout(0, 0, r - l, b - t);
}

Также добавьте этот макет в Ресурсы / Макет :

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:layout_weight="1">
    <TextureView
        android:id="@+id/textureView"
        android:layout_marginTop="-95dp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
    <Button
        android:id="@+id/toggleFlashButton"
        android:layout_width="37dp"
        android:layout_height="37dp"
        android:layout_gravity="top|left"
        android:layout_marginLeft="25dp"
        android:layout_marginTop="25dp"
        android:background="@drawable/NoFlashButton" />
    <Button
        android:id="@+id/switchCameraButton"
        android:layout_width="35dp"
        android:layout_height="26dp"
        android:layout_gravity="top|right"
        android:layout_marginRight="25dp"
        android:layout_marginTop="25dp"
        android:background="@drawable/ToggleCameraButton" />
    <Button
        android:id="@+id/takePhotoButton"
        android:layout_width="65dp"
        android:layout_height="65dp"
        android:layout_marginBottom="15dp"
        android:layout_gravity="center|bottom"
        android:background="@drawable/TakePhotoButton" />
</FrameLayout>

И значки кнопок в Ресурсы / Drawable .

0 голосов
/ 12 июня 2018

Вы можете использовать RelativeLayout в MainPage.Затем вы добавляете Button и CameraPreview в него.Например:

<?xml version="1.0" encoding="UTF-8"?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms" 
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" 
             xmlns:local="clr-namespace:CustomRenderer;assembly=CustomRenderer"
             x:Class="CustomRenderer.MainPage"
             Padding="0,20,0,0"
             Title="Main Page">
    <ContentPage.Content>
        <RelativeLayout>
            <local:CameraPreview
                Camera="Rear"  x:Name="Camera"                     
                RelativeLayout.WidthConstraint="{ConstraintExpression Type=RelativeToParent,Property=Width,Factor=1,Constant=0}"
                RelativeLayout.HeightConstraint="{ConstraintExpression Type=RelativeToParent,Property=Height,Factor=1,Constant=0}"/>
            <Button x:Name="button"
                    Text="Button" Clicked="button_Clicked"
                    RelativeLayout.YConstraint="{ConstraintExpression Type=RelativeToView,ElementName=Camera,Property=Height,Factor=.85,Constant=0}"
                    RelativeLayout.XConstraint="{ConstraintExpression Type=RelativeToView,ElementName=Camera,Property=Width,Factor=.05,Constant=0}"
                    RelativeLayout.WidthConstraint="{ConstraintExpression Type=RelativeToParent,Property=Width,Factor=.9,Constant=0}"
                    RelativeLayout.HeightConstraint="{ConstraintExpression Type=RelativeToParent,Property=Height,Factor=.125,Constant=0}" />
        </RelativeLayout>
    </ContentPage.Content>
</ContentPage>

И вы можете использовать MessagingCenter для запуска события клика CameraPreview.

Например, в рендере:

    protected override void OnElementChanged(ElementChangedEventArgs<CustomRenderer.CameraPreview> e)
    {
        base.OnElementChanged(e);

        if (Control == null)
        {
            cameraPreview = new CameraPreview(Context);

            SetNativeControl(cameraPreview);

            MessagingCenter.Subscribe<MainPage>(this, "ButtonClick", (sender) => {
                if (cameraPreview.IsPreviewing)
                {
                    cameraPreview.Preview.StopPreview();
                    cameraPreview.IsPreviewing = false;
                }
                else
                {
                    cameraPreview.Preview.StartPreview();
                    cameraPreview.IsPreviewing = true;
                }
            });
        }

        if (e.OldElement != null)
        {
            // Unsubscribe
            cameraPreview.Click -= OnCameraPreviewClicked;
        }
        if (e.NewElement != null)
        {
            Control.Preview = Camera.Open((int)e.NewElement.Camera);
            // Subscribe
            cameraPreview.Click += OnCameraPreviewClicked;
        }
    }

И в событии нажатия кнопки:

    private void button_Clicked(object sender, System.EventArgs e)
    {
        MessagingCenter.Send<MainPage>(this, "ButtonClick");
    }
...