Вопрос по android, surfaceview, camera – Как установить размер предварительного просмотра камеры в квадратное соотношение сторон в квадрате SurfaceView (например, в Instagram)

46

Я пытаюсь развить свою собственную работу с камерой, но у меня есть проблема, которую я не могу решить ...

То, что я хочу, это что-то очень похожее на фоторамку Instagram, и вот что я получаю:

My image

Когда я должен получить что-то вроде этого:

Instagram image

а также...

My second image

когда я должен получить что-то вроде:

Instagram 2

Я думаю, что хорошо управляю предварительным просмотром SurfaceView и Camera, используя только

Camera.Parameters parameters = camera.getParameters();
camera.setDisplayOrientation(90);

и Custom SurfaceView:

public class SquaredSurfaceView extends SurfaceView {

private int width;
private int height;

public SquaredSurfaceView(Context context) {
    super(context);
}

public SquaredSurfaceView(Context context, AttributeSet attrs) {
    super(context, attrs);
}

public SquaredSurfaceView(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
}

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    width = MeasureSpec.getSize(widthMeasureSpec);
    height = width;
    setMeasuredDimension(width, width);
}

public int getViewWidth() {
    return width;
}

public int getViewHeight() {
    return height;
}

}

Что я делаю не так ?? :-(

Error: User Rate Limit Exceeded Cruceo
Error: User Rate Limit Exceeded Cruceo
Error: User Rate Limit Exceeded cesards
Error: User Rate Limit Exceeded Teraiya Mayur
Error: User Rate Limit Exceeded cesards

Ваш Ответ

6   ответов
5

Error: User Rate Limit Exceeded

   camera.setDisplayOrientation(90);
   Camera.Parameters params= camera.getParameters();
   surfaceView.getLayoutParams().width=params.getPreviewSize().height;
   surfaceView.getLayoutParams().height=params.getPreviewSize().width;

Error: User Rate Limit Exceeded

Спасибо за ответ. Можете ли вы сказать мне, почему это работает так?
Я смотрю на эту проблему в течение половины дня; решение предлагается здесь:stackoverflow.com/questions/19577299/…, вид работы, но это может снизить производительность (следовательно, не очень хорошее решение). Я попробовал ваше решение, которое казалось действительно легким по сравнению с тем, что в другом документеLog.d(..) проверить размер высоты и ширины до и после вашего кода и ничего не изменилось.
Это решает мою проблему на Nexus 5x, но у меня все еще возникает проблема с moto g2, которая ведет себя по-разному для разных версий устройств или для них это какой-то другой сценарий.
Это вызвало для меня исключение.
2

Error: User Rate Limit ExceededError: User Rate Limit Exceeded

public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
        ...
        params.setPreviewSize(viewParams.height, viewParams.width);
        camera.setParameters(params);
18

Error: User Rate Limit Exceeded

Error: User Rate Limit Exceeded

Error: User Rate Limit Exceeded

@ xramos: Привет, я уже установил полную камеру, как вы упомянули, но не могу обрезать для всех устройств. Также есть разное разрешение камеры для всех устройств. Вы можете мне помочь? Ждем ваших отзывов.
Я думаю, если уже все объяснили. Я не знаю, так ли на самом деле это делает Instagram, но это так. получите предварительный размер камеры, подходящий для вашего устройства, а затем просто поместите несколько черных макетов поверх макета кадра камеры, чтобы сделать видимую камеру прямоугольной. вам нужно будет сделать некоторые вычисления позже, когда вы сделаете снимок. Но опять же, я не уверен, действительно ли они это делают
Меня интересует, как IG это делает.
@ Xramos, как я могу сделать то, что сделал Instagram? У вас есть ссылки или указатели? пожалуйста, помогите мне :) спасибо.
-1

Error: User Rate Limit Exceeded

Error: User Rate Limit ExceededLinear LayoutError: User Rate Limit Exceeded

Error: User Rate Limit Exceeded

Error: User Rate Limit ExceededscaleBitmapError: User Rate Limit Exceeded

Error: User Rate Limit ExceededError: User Rate Limit Exceeded

Ответ обычно содержит немного больше деталей, таких как код или более подробные объяснения. Добавление этого определенно сделало бы это более полезным.
-1

Error: User Rate Limit Exceeded

public static void initialCameraPictureSize(Context context, android.hardware.Camera.Parameters parameters) {

    List list = parameters.getSupportedPictureSizes();
    if(list != null) {
        android.hardware.Camera.Size size = null;
        Iterator iterator = list.iterator();
        do {
            if(!iterator.hasNext())
                break;
            android.hardware.Camera.Size size1 = (android.hardware.Camera.Size)iterator.next();
            if(Math.abs(3F * ((float)size1.width / 4F) - (float)size1.height) < 0.1F * (float)size1.width && (size == null || size1.height > size.height && size1.width < 3000))
                size = size1;
        } while(true);
        if(size != null)
            parameters.setPictureSize(size.width, size.height);
        else
            Log.e("CameraSettings", "No supported picture size found");
    }
}
Это плохой ответ, потому что он предполагает 4: 3 камеру. Камера может быть 16: 9
@Aggressor это демо. Где вы можете установить, какое отношение будет у вас к заполнителю / поверхности.
Этот пример, безусловно, можно улучшить, чтобы он легко вычислял соотношение вместо жесткого кодирования
2

Error: User Rate Limit Exceeded

Error: User Rate Limit Exceeded

package com.example.squaredviewer;

import android.content.Context;
import android.util.AttributeSet;
import android.view.Display;
import android.view.WindowManager;
import android.widget.RelativeLayout;

/**
* Created by yadirhb on 14-08-2015.
*/
public class SquaredFrame extends RelativeLayout{
    public SquaredFrame(Context context, AttributeSet attrs) {
         super(context, attrs);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        int size = Math.min(getMeasuredWidth(), getMeasuredHeight());
        setMeasuredDimension(size, size);
    }
}

Error: User Rate Limit Exceeded

Error: User Rate Limit Exceeded

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal"
android:visibility="visible">

<RelativeLayout
    android:id="@+id/camera_preview"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentLeft="false"
    android:layout_alignParentTop="false"
    android:layout_centerInParent="true"
    android:background="#ffffff">

</RelativeLayout>

<LinearLayout
    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <LinearLayout
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_weight="1"
        android:background="#131008">

    </LinearLayout>

    <com.example.squaredviewer.SquaredFrame
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_centerInParent="true"></com.example.squaredviewer.SquaredFrame>

    <LinearLayout
        android:orientation="vertical"
        android:layout_width="match_parent",
        android:layout_height="match_parent"
        android:layout_weight="1"
        android:background="#131008" />
</LinearLayout>
</RelativeLayout>

Error: User Rate Limit Exceeded

Error: User Rate Limit Exceeded

public class CameraPreview extends SurfaceView implements SurfaceHolder.Callback {

    private final String TAG = "PIC-FRAME";

    private SurfaceHolder mHolder;
    private Camera mCamera;
    private Display display;

    public CameraPreview(Activity context, Camera camera) {
        super(context);
        mCamera = camera;
        display = ((WindowManager) context.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();

        // Install a SurfaceHolder.Callback so we get notified when the
        // underlying surface is created and destroyed.
        mHolder = getHolder();
        mHolder.addCallback(this);
        // deprecated setting, but required on Android versions prior to 3.0
        mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

        setKeepScreenOn(true);
    }

    public void surfaceDestroyed(SurfaceHolder holder) {
        // empty. Take care of releasing the Camera preview in your activity.
        this.getHolder().removeCallback(this);
    }

    public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
        // If your preview can change or rotate, take care of those events here.
        // Make sure to stop the preview before resizing or reformatting it.

        if (mHolder.getSurface() == null) {
            // preview surface does not exist
            return;
        }

        try {
            // stop preview before making changes
            mCamera.stopPreview();
            // set preview size and make any resize, rotate or
            // reformatting changes here
            // Now that th,e size is known, set up the camera parameters and begin
            // the preview.
            Camera.Parameters parameters = mCamera.getParameters();
            // You need to choose the most appropriate previewSize for your app
            Camera.Size previewSize = parametes.getSupportedPreviewSizes().get(0);
            parameters.setPreviewSize(previewSize.width, previewSize.height);


             // start preview with new settings
             mCamera.setParameters(parameters);

             // Set the holder size based on the aspect ratio
             int size = Math.min(display.getWidth(), display.getHeight());
             double ratio = (double) previewSize.width / previewSize.height;

             mHolder.setFixedSize((int)(size * ratio), size);
             mCamera.setPreviewDisplay(mHolder);
             mCamera.startPreview();

         } catch (Exception e) {
             Log.d(TAG, "Error starting camera preview: " + e.getMessage());
         }
      }
   }
}

Error: User Rate Limit Exceeded

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_picture_taker);

    mDecorView = getWindow().getDecorView();

    //mCamera = a camera instance;

    // Create our Preview view and set it as the content of our activity.
    mPreview = new CameraPreview(this, mCamera);

    //Layout where camera preview is shown.
    RelativeLayout preview = (RelativeLayout) findViewById(R.id.camera_preview);
    //FrameLayout stack controllers inside and superpose them.
    preview.addView(mPreview, 0);

    // TODO
}

Error: User Rate Limit Exceeded

@YadirHB Каково содержимое файла макета: activity_picture_taker.xml
есть готовый демонстрационный проект?
невероятное решение, YadirHB

Похожие вопросы