【问题标题】:Turn on/off/auto flash mode打开/关闭/自动闪光模式
【发布时间】:2015-09-03 08:34:07
【问题描述】:

我正在尝试在三种方法之间切换,以在我的相机应用程序中打开/关闭和自动启动闪光灯。我将只使用一个按钮来切换,就像在谷歌相机应用程序中一样。第一次点击然后关闭,第二次将其打开,第三次将其设置为自动。我创建了按钮,并使用此方法更改图标:

private void updateFlashOnScreenIndicator(String value) {
        ImageButton switchFlash = (ImageButton) findViewById(R.id.flash_on_off);
        if (switchFlash == null) {
            return;
        }
        if (value == null || Parameters.FLASH_MODE_OFF.equals(value)) {
            switchFlash.setImageResource(R.drawable.ic_flash_off_white_24dp);
        } else {
            if (Parameters.FLASH_MODE_AUTO.equals(value)) {
                switchFlash.setImageResource(R.drawable.ic_flash_auto_white_24dp);
            } else if (Parameters.FLASH_MODE_ON.equals(value)) {
                switchFlash.setImageResource(R.drawable.ic_flash_on_white_24dp);
            } else {
                switchFlash.setImageResource(R.drawable.ic_flash_off_white_24dp);
            }
        }
    }

它基本上可以工作......事实上,如果我尝试创建一个方法(在我的按钮的 onClick 中调用),只需编写:

public void flashToggle(View view) {
        updateFlashOnScreenIndicator("on");
    }

它改变了图标并设置了闪光灯。但当然它并没有真正设置闪光灯!如何在点击时在这三种模式之间切换?

编辑: 我在我的按钮中找到了这个类和 onClick 现在我可以在状态和图标之间正确切换......但闪光灯仍然没有发生任何事情......它没有改变......它总是关闭

public class FlashButton extends ImageButton {
    private Camera.Parameters mParameters;
    private Camera camera;
    public enum FlashEnum {
        AUTOMATIC, ON, OFF
    }

    public interface FlashListener {
        void onAutomatic();
        void onOn();
        void onOff();
    }

    private FlashEnum mState;
    private FlashListener mFlashListener;

    public FlashButton(Context context, AttributeSet attrs) {
        super(context, attrs);
        this.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View view) {
                int next = ((mState.ordinal() + 1) % FlashEnum.values().length);
                setState(FlashEnum.values()[next]);
                performFlashClick();
            }
        });
        //Sets initial state
        setState(FlashEnum.AUTOMATIC);
    }

    private void performFlashClick() {
        Camera.Parameters parameters = CameraController1.getParameters();
        if(mFlashListener == null)return;
        switch (mState) {
            case AUTOMATIC:
                mFlashListener.onAutomatic();
                parameters.setFlashMode(Camera.Parameters.FLASH_MODE_AUTO);
                Log.d("Falsh", "Auto");
                break;
            case ON:
                mFlashListener.onOn();
                parameters.setFlashMode(Camera.Parameters.FLASH_MODE_ON);
                Log.d("Falsh", "On");
                break;
            case OFF:
                mFlashListener.onOff();
                parameters.setFlashMode(Camera.Parameters.FLASH_MODE_OFF);
                Log.d("Falsh", "Off");
                break;
        }
    }

    private void createDrawableState() {

        switch (mState) {
            case AUTOMATIC:
                setImageResource(R.drawable.ic_flash_auto_white_24dp);
                break;
            case ON:
                setImageResource(R.drawable.ic_flash_on_white_24dp);
                break;
            case OFF:
                setImageResource(R.drawable.ic_flash_off_white_24dp);
                break;
        }
    }


    public FlashEnum getState() {
        return mState;
    }

    public void setState(FlashEnum state) {
        if(state == null)return;
        this.mState = state;
        createDrawableState();

    }

    public FlashListener getFlashListener() {
        return mFlashListener;
    }

    public void setFlashListener(FlashListener flashListener) {
        this.mFlashListener = flashListener;
    }

}

现在的按钮是:

<net.cc.mycameraapp.FlashButton
            android:id="@+id/flash_on_off"
            android:background="@null"
            android:layout_width="50dp"
            android:layout_height="50dp"
            android:scaleType="fitCenter"
            android:layout_marginTop="4dp"
            android:src="@drawable/ic_flash_off_white_24dp"
            android:padding="14dp"
            android:layout_centerHorizontal="true">
        </net.cc.mycameraapp.FlashButton>

【问题讨论】:

  • 通过使用 int 数组并使用 currentIndex 遍历它,然后根据 switch(currentIndex) 更新逻辑
  • 是的,好的..我找到了切换的方法,但我找不到设置闪光灯开/关/自动的方法
  • 所以基本上你的问题类似于this
  • 为什么你不与String 比较我的意思是你可以这样做:String whatmode = p.getFlashMode(); 其中 p 是 Camera.Parameters p= mCamera.getParameters(); 而你是 if (flashmode.equals(value)){//blabla}
  • @Skizo 看到我的编辑.. 你能帮帮我吗?我很接近......但我不明白我错在哪里

标签: java android android-camera


【解决方案1】:

让这个全球化

Camera.Parameters parameters;
Icon  flash;

flash = (Icon) findViewById(R.id.flash);

制作一个单独的本地参数并在每次点击flash时设置它。我分别为 FLASH AUTO、FLASH ON 和 FLASH OFF 维护了文本 c i 和 N。

flash.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (flash.getText().equals("c")) {
                    flash.setText("N");
                    Camera.Parameters mParameters;
                    mParameters = mCamera.getParameters();
                    mParameters.setFlashMode(Camera.Parameters.FLASH_MODE_ON);
                    mCamera.setParameters(mParameters);
            } else 
                if (flash.getText().equals("N")) {
                    flash.setText("i");
                    Camera.Parameters mParameters;
                    mParameters = mCamera.getParameters();
                    mParameters.setFlashMode(Camera.Parameters.FLASH_MODE_OFF);
                    mCamera.setParameters(mParameters);
            } else if (flash.getText().equals("i")) {
                    flash.setText("c");
                    Camera.Parameters mParameters;
                    mParameters = mCamera.getParameters();
                    mParameters.setFlashMode(Camera.Parameters.FLASH_MODE_AUTO);
                    mCamera.setParameters(mParameters);
            }
        }
    });

在surfacecreated里面放如下

 @Override
public void surfaceCreated(SurfaceHolder surfaceHolder) {
    try {
        mCamera = Camera.open();
        parameters = mCamera.getParameters();
        if (flash.getText().equals("c")) {
            parameters.setFlashMode(Camera.Parameters.FLASH_MODE_AUTO);
        } else if (flash.getText().equals("N")) {
            parameters.setFlashMode(Camera.Parameters.FLASH_MODE_ON);
        } else if (flash.getText().equals("i")) {
            parameters.setFlashMode(Camera.Parameters.FLASH_MODE_OFF);
        }

        mCamera.setParameters(parameters);
        setCameraDisplayOrientation(this, Camera.CameraInfo.CAMERA_FACING_BACK, mCamera);
        mCamera.setPreviewDisplay(surfaceHolder);
        mCamera.startPreview();
    } catch (RuntimeException e) {
        System.err.println("camera0 :" + e);
        return;
    } catch (IOException e) {
        e.printStackTrace();
    }
}

【讨论】:

    猜你喜欢
    • 2013-06-20
    • 1970-01-01
    • 1970-01-01
    • 2011-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多