package com.wistron.WiCamera;
import java.io.IOException;
import java.util.ArrayList;
import Utilities.CSStaticData;
import Utilities.SystemInfo;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.graphics.Color;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.animation.Animation;
import android.view.animation.AnimationSet;
import android.view.animation.RotateAnimation;
import android.view.animation.ScaleAnimation;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.OrientationEventListener;
import android.view.Window;
import android.view.WindowManager;
import android.widget.ImageButton;
import android.widget.ProgressBar;
import android.widget.RelativeLayout;
import android.widget.ToggleButton;
import com.wistron.WiViewer.MediaFilePicker;
import com.wistron.WiViewer.TDStaticData;
import com.wistron.WiViewer.WiImageView;
import com.wistron.swpc.wicamera3dii.R;
/**
*
* @Copyright (c) 2012 Wistron SWPC All rights reserved.
*
* @created: 2012/06/21
* @filename: CameraPreview.java
* @author WH1107063(周海江)
* @purpose 照相的activity,主要用于连拍两张图片合成3D图片的操作逻辑
*
*
*
*
*/
public class CameraPreview extends Activity {
// 打开camera的surfaceview
public CameraView mPreview;
// 预览的view
private OverView imageview;
public int mAlpha = 160;
private int stdx;
private int mOldAlpha;
private ImageButton saveBtn;
// 照相按钮
private ToggleButton takePictureBtn;
// 保存进度
private ProgressBar circleProgressBar;
// 定义一个Handler
protected static final int FINISH = 0x10000;
// 接受消息的handle
public static Handler mHandler;
String Tag = "CameraPreview";
// 播放声音
MediaFilePicker mp = null;
public ArrayList<String> fileArray;
// 图片预览
WiImageView wv = null;
RelativeLayout mRelativeLayout;
SystemInfo si = new SystemInfo();
// 监听屏幕旋转的类
MyOrientationEventListener orientationListener;
public int mOrientation;
public int mOrientationCompensation;
public int mCurrentDegree = OrientationEventListener.ORIENTATION_UNKNOWN;
private int mPreOrientation = 270;
public static boolean isReview = false;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setWindows();
// 设置Activity的根内容视图
setContentView(R.layout.controllpad);
// 初始化控件
mRelativeLayout = (RelativeLayout) findViewById(R.id.camerathree);
circleProgressBar = (ProgressBar) findViewById(R.id.circleProgressBar);
circleProgressBar.setIndeterminate(false);
takePictureBtn = (ToggleButton) findViewById(R.id.ImageButtonTake);
saveBtn = (ImageButton) findViewById(R.id.ImageButtonSave);
mPreview = (CameraView) findViewById(R.id.surfaceview);
imageview = (OverView) findViewById(R.id.imageview);
fileArray = new ArrayList<String>();
// 得到屏幕的宽高
WiCameraActivity.initializeScreenBrightness(getWindow(),
getContentResolver());
TDStaticData.SCREEN_WIDTH = getWindowManager().getDefaultDisplay()
.getWidth();
TDStaticData.SCREEN_HEIGHT = getWindowManager().getDefaultDisplay()
.getHeight();
TDStaticData.SCREEN_WIDTH_ORG = TDStaticData.SCREEN_WIDTH;
TDStaticData.SCREEN_HEIGHT_ORG = TDStaticData.SCREEN_HEIGHT;
wv = new WiImageView(CameraPreview.this, mp);
mRelativeLayout.addView(wv);
wv.setVisibility(View.GONE);
orientationListener = new MyOrientationEventListener(this);
orientationListener.enable();
takePictureBtn.setOnClickListener(MyonClickListener);
saveBtn.setOnClickListener(MyonClickListener);
// handle的初始化
mHandler = new Handler() {
public void handleMessage(Message msg) {
switch (msg.what) {
// 保存图片后预览
case FINISH:
isReview = true;
// takePictureBtn.setVisibility(View.VISIBLE);
circleProgressBar.setVisibility(View.GONE);
// imageview.setAlpha(160);
// updateImageView();
ArrayList<String> tempArraylist = new ArrayList<String>();
for (int i = fileArray.size() - 1; i >= 0; i--) {
tempArraylist.add(fileArray.get(i));
}
System.out.println(tempArraylist);
si.setScreenDimension(true);
mp = new MediaFilePicker(tempArraylist,
tempArraylist.get(0));
// wv = new WiImageView(CameraPreview.this, mp);
wv.setMediaPicker(mp);
wv.ChangeMode(true);
wv.setVisibility(View.VISIBLE);
wv.setCurbitmapR(wv.getNextBitmapEx(mp.getCurrentFileName()));
wv.setBackgroundColor(Color.BLACK);
wv.setOrientationType(1);
// setScreenDimension(true);
break;
// 第一次拍照完后设置,设置拍照按钮可用进行第二次拍照
case 100:
takePictureBtn.setEnabled(true);
break;
// 在竖屏情况下不能拍3D照片
case 200:
if (mCurrentDegree == 90 || mCurrentDegree == 270) {
takePictureBtn.setEnabled(false);
} else {
takePictureBtn.setEnabled(true);
}
break;
}
}
};
}
@Override
protected void onResume() {
si.setScreenDimension(false);
// TODO Auto-generated method stub
if (orientationListener != null) {
orientationListener.enable();
}
super.onResume();
}
/**
* 打开3D屏幕
*
* @param is3D
* 如果为true 则打开3D屏,否则打开2D屏
*/
public void setScreenDimension(boolean is3D) {
// m_imageview.ChangeMode(is3D);
String[] cmdTurnOn3D = { // 开启屏幕3D命名
"/system/bin/sh", "-c",
"echo 1 > /sys/devices/platform/mipi_masterimage.513/enable_3d_barrier" };
String[] cmdTurnOff3D = { // 关闭屏幕3D命令
"/system/bin/sh", "-c",
"echo 0 > /sys/devices/platform/mipi_masterimage.513/enable_3d_barrier" };
CSStaticData.g_is_3D_mode = is3D;
try {
if (CSStaticData.g_is_3D_mode) {
if (CSStaticData.DEBUG) {
Log.w(Tag, "[setScreenDimension]开启屏幕3D显示模式");
}
Runtime.getRuntime().exec(cmdTurnOn3D);
} else {
if (CSStaticData.DEBUG) {
Log.w(Tag, "[setScreenDimension]关闭屏幕3D显示模式");
}
Runtime.getRuntime().exec(cmdTurnOff3D);
}
} catch (IOException exp) {
if (CSStaticData.DEBUG) {
Log.w(Tag, "[setScreenDimension]屏幕3D显示模式切换:失败,命令行输入流异常");
}
} catch (SecurityException exp) {
if (CSStaticData.DEBUG) {
Log.w(Tag, "[setScreenDimension]屏幕3D显示模式切换:失败,系统安全保护阻止本操作");
}
} catch (Exception exp) {
if (CSStaticData.DEBUG) {
Log.w(Tag, "[setScreenDimension]屏幕3D显示模式切换:失败,未知错误");
}
}
}
public OnClickListener MyonClickListener = new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
switch (v.getId()) {
// 拍照
case R.id.ImageButtonTake:
mPreview.takePicture();
takePictureBtn.setEnabled(false);
break;
default:
break;
}
}
};
/**
* 设置全屏,无标题
*/
public void setWindows() {
// 窗口去掉标题
final Window win = getWindow();
win.setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
requestWindowFeature(Window.FEATURE_NO_TITLE);
// 窗口设置为全屏
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
// 设置窗口为半透明
// getWindow().setFormat(PixelFormat.TRANSLUCENT);
}
// 显示预览imageview
void updateImageView() {
imageview.SetmBitmap(mPreview.mBitmap);
imageview.setAlpha(mAlpha);
imageview.setVisibility(View.VISIBLE);
imageview.alpha = 160;
imageview.invalidate();
}
// 拍照结束,保存图片
void takePictureFinish() {
// saveBtn.setVisibility(View.VISIBLE);
circleProgressBar.setVisibility(View.VISIBLE);
takePictureBtn.setVisibility(View.GONE);
imageview.setVisibility(View.GONE);
// saveBtn.setVisibility(View.INVISIBLE);
// 存盘时显示等待图标,使用异步模式
new myAsy().execute();
}
@Override
protected void onPause() {
// TODO Auto-generated method stub
mPreview.stopPreview();
mPreview.releaseCamera();
super.onPause();
}
@Override
protected void onDestroy() {
// TODO Auto-generated method stub
mPreview.stopPreview();
mPreview.releaseCamera();
if (orientationListener != null) {
orientationListener.disable();
orientationListener = null;
}
super.onDestroy();
}
/*
* 异步保存图片
*/
class myAsy extends AsyncTask<Void, Void, Void> {
@Override
protected Void doInBackground(Void... params) {
// TODO Auto-generated method stub
mPreview.savePicture();
return null;
}
}
@Override
public boolean onKeyDown(int keyCode, android.view.KeyEvent event) {
// TODO Auto-generated method stub
// 在按下back键时的操作
if (event.getKeyCode() == KeyEvent.KEYCODE_BACK) {
// 如果正在预览,则返回拍照界面,否则退出
if (isReview == true) {
takePictureBtn.setVisibility(View.VISIBLE);
wv.setVisibility(View.GONE);
mPreview.startPreview();
si.setScreenDimension(false);
isReview = false;
return false;
} else {
isReview = false;
onDestroy();
this.finish();
return false;
}
}
return false;
}
/**
* 触摸屏幕是改变左图的透明度
*/
@Override
public boolean onTouchEvent(MotionEvent event) {
// TODO Auto-generated method stub
if (mPreview.bFlag) {
imageview.onTouchEvent(event);
}
return false;
}
/**
* 监听屏幕转动的角度的类
*
* @author WH1107063
*
*/
/**
* 监听屏幕转动的角度的类
*
* @author WH1107063
*
*/
public class MyOrientationEventListener extends OrientationEventListener {
Animation m_mr_smaller;
Animation m_mr_bigger;
public MyOrientationEventListener(Context context) {
super(context);
}
@Override
public void onOrientationChanged(int orientation) {
boolean isGsensor = StoredData.getBoolean(StoredData.m_GSENSOR,
true);
if (!isGsensor) {
return;
}
if (orientation == ORIENTATION_UNKNOWN)
return;
mOrientation = Util.roundOrientation(orientation, mOrientation);
int orientationCompensation = mOrientation
+ Util.getDisplayRotation(CameraPreview.this);
if (mOrientationCompensation != orientationCompensation) {
mOrientationCompensation = orientationCompensation;
mCurrentDegree = mOrientationCompensation;
// System.out.println("mOrientationss=" + mCurrentDegree);
// System.out.println("mOrientation=======" + mOrientation);
// 发送手机的当前旋转角度,如果为竖屏则禁用拍照按钮
// if (mPreOrientation != mOrientation) {
mHandler.removeMessages(200);
mHandler.sendEmptyMessage(200);
// }
}
}
}
}