diff options
author | junjiez <junjiez@codeaurora.org> | 2017-06-29 13:44:15 +0800 |
---|---|---|
committer | junjiez <junjiez@codeaurora.org> | 2017-07-26 15:28:52 +0800 |
commit | ef407574ede2694755abbd5a872936623030c1d7 (patch) | |
tree | d89371f4fdc74d928f032bc6bba3d921a0bad01d /src/com/android/camera/ui | |
parent | 73c61caa5c7d17f02153bd559e5dbe340dbff245 (diff) | |
download | android_packages_apps_Snap-ef407574ede2694755abbd5a872936623030c1d7.tar.gz android_packages_apps_Snap-ef407574ede2694755abbd5a872936623030c1d7.tar.bz2 android_packages_apps_Snap-ef407574ede2694755abbd5a872936623030c1d7.zip |
SnapdragonCamera:RTB UI
1.add a new icon on the top of camera
control to enable bokeh mode.
2.add toast to show the distance,lighting
and effect alert.
3.add debug mode to save all the images
received from HAL separately
4.modify ui according to the spec
Change-Id: I1178015f48c29cade4e14bb531c9727665905fec
Diffstat (limited to 'src/com/android/camera/ui')
-rwxr-xr-x[-rw-r--r--] | src/com/android/camera/ui/CameraControls.java | 93 | ||||
-rwxr-xr-x[-rw-r--r--] | src/com/android/camera/ui/PieRenderer.java | 116 |
2 files changed, 185 insertions, 24 deletions
diff --git a/src/com/android/camera/ui/CameraControls.java b/src/com/android/camera/ui/CameraControls.java index 2a2222804..73afcd5a0 100644..100755 --- a/src/com/android/camera/ui/CameraControls.java +++ b/src/com/android/camera/ui/CameraControls.java @@ -59,6 +59,7 @@ public class CameraControls extends RotatableLayout { private View mFrontBackSwitcher; private View mHdrSwitcher; private View mTsMakeupSwitcher; + private View mBokehSwitcher; private View mIndicators; private View mPreview; private View mSceneModeSwitcher; @@ -69,7 +70,7 @@ public class CameraControls extends RotatableLayout { private ArrowTextView mRefocusToast; private int mSize; - private static final int WIDTH_GRID = 5; + private static int WIDTH_GRID = 5; private static final int HEIGHT_GRID = 7; private static boolean isAnimating = false; private ArrayList<View> mViewList; @@ -86,7 +87,8 @@ public class CameraControls extends RotatableLayout { private static final int MUTE_INDEX = 9; private static final int VIDEO_SHUTTER_INDEX = 10; private static final int EXIT_PANORAMA_INDEX = 11; - private static final int MAX_INDEX= 12; + private static final int BOKEH_INDEX = 12; + private static final int MAX_INDEX= 13; private static final int ANIME_DURATION = 300; private float[][] mLocX = new float[4][MAX_INDEX]; private float[][] mLocY = new float[4][MAX_INDEX]; @@ -106,6 +108,8 @@ public class CameraControls extends RotatableLayout { private static final int LOW_REMAINING_PHOTOS = 20; private static final int HIGH_REMAINING_PHOTOS = 1000000; + private boolean mIsBokehMode = false; + AnimatorListener outlistener = new AnimatorListener() { @Override public void onAnimationStart(Animator animation) { @@ -126,9 +130,11 @@ public class CameraControls extends RotatableLayout { } else { mHdrSwitcher.setVisibility(View.INVISIBLE); } + if (mIsBokehMode) { + mBokehSwitcher.setVisibility(View.INVISIBLE); + } mSceneModeSwitcher.setVisibility(View.INVISIBLE); mFilterModeSwitcher.setVisibility(View.INVISIBLE); - mSwitcher.setVisibility(View.INVISIBLE); mShutter.setVisibility(View.INVISIBLE); mVideoShutter.setVisibility(View.INVISIBLE); @@ -151,9 +157,11 @@ public class CameraControls extends RotatableLayout { } else { mHdrSwitcher.setVisibility(View.INVISIBLE); } + if (mIsBokehMode) { + mBokehSwitcher.setVisibility(View.INVISIBLE); + } mSceneModeSwitcher.setVisibility(View.INVISIBLE); mFilterModeSwitcher.setVisibility(View.INVISIBLE); - mSwitcher.setVisibility(View.INVISIBLE); mShutter.setVisibility(View.INVISIBLE); mVideoShutter.setVisibility(View.INVISIBLE); @@ -231,6 +239,9 @@ public class CameraControls extends RotatableLayout { } else { mHdrSwitcher.setPressed(false); } + if (mIsBokehMode) { + mBokehSwitcher.setPressed(false); + } mSceneModeSwitcher.setPressed(false); } @@ -247,6 +258,9 @@ public class CameraControls extends RotatableLayout { } else { mHdrSwitcher.setEnabled(enable); } + if (mIsBokehMode) { + mBokehSwitcher.setEnabled(enable); + } mPreview.setEnabled(enable); } @@ -262,6 +276,11 @@ public class CameraControls extends RotatableLayout { if (mHdrSwitcher.getVisibility() == View.VISIBLE) mViewList.add(mHdrSwitcher); } + if (mIsBokehMode) { + if (mBokehSwitcher.getVisibility() == View.VISIBLE) { + mViewList.add(mBokehSwitcher); + } + } if (mSceneModeSwitcher.getVisibility() == View.VISIBLE) mViewList.add(mSceneModeSwitcher); if (mFilterModeSwitcher.getVisibility() == View.VISIBLE) @@ -299,6 +318,7 @@ public class CameraControls extends RotatableLayout { } else { mHdrSwitcher = findViewById(R.id.hdr_switcher); } + mBokehSwitcher = findViewById(R.id.bokeh_switcher); mMenu = findViewById(R.id.menu); mMute = findViewById(R.id.mute_button); mExitPanorama = findViewById(R.id.exit_panorama); @@ -379,7 +399,12 @@ public class CameraControls extends RotatableLayout { private void setLocation(int w, int h) { int rotation = getUnifiedRotation(); - toIndex(mSwitcher, w, h, rotation, 4, 6, SWITCHER_INDEX); + if (mIsBokehMode) { + toIndex(mSwitcher, w, h, rotation, 5, 6, SWITCHER_INDEX); + toIndex(mBokehSwitcher,w,h,rotation,5,0,BOKEH_INDEX); + } else { + toIndex(mSwitcher, w, h, rotation, 4, 6, SWITCHER_INDEX); + } toIndex(mVideoShutter, w, h, rotation, 3, 6, VIDEO_SHUTTER_INDEX); toIndex(mMenu, w, h, rotation, 4, 0, MENU_INDEX); toIndex(mMute, w, h, rotation, 3, 0, MUTE_INDEX); @@ -490,6 +515,9 @@ public class CameraControls extends RotatableLayout { } else { mHdrSwitcher.setX(mLocX[idx1][HDR_INDEX] + x); } + if (mIsBokehMode) { + mBokehSwitcher.setX(mLocX[idx1][BOKEH_INDEX] + x); + } mSceneModeSwitcher.setX(mLocX[idx1][SCENE_MODE_INDEX] + x); mFilterModeSwitcher.setX(mLocX[idx1][FILTER_MODE_INDEX] + x); mMenu.setX(mLocX[idx1][MENU_INDEX] + x); @@ -507,6 +535,9 @@ public class CameraControls extends RotatableLayout { } else { mHdrSwitcher.setY(mLocY[idx1][HDR_INDEX] + y); } + if (mIsBokehMode){ + mBokehSwitcher.setY(mLocY[idx1][BOKEH_INDEX] + y); + } mSceneModeSwitcher.setY(mLocY[idx1][SCENE_MODE_INDEX] + y); mFilterModeSwitcher.setY(mLocY[idx1][FILTER_MODE_INDEX] + y); mMenu.setY(mLocY[idx1][MENU_INDEX] + y); @@ -529,6 +560,20 @@ public class CameraControls extends RotatableLayout { } else { mHdrSwitcher.setVisibility(status); } + if (mIsBokehMode) { + mBokehSwitcher.setVisibility(status); + } + } + + public void setBokehMode(boolean enable) { + mIsBokehMode = enable; + if (mIsBokehMode) { + WIDTH_GRID = 6; + } else { + WIDTH_GRID = 5; + mBokehSwitcher.setVisibility(GONE); + } + requestLayout(); } public void hideUI() { @@ -542,6 +587,9 @@ public class CameraControls extends RotatableLayout { } else { mHdrSwitcher.animate().cancel(); } + if (mIsBokehMode) { + mBokehSwitcher.animate().cancel(); + } mSceneModeSwitcher.animate().cancel(); mFilterModeSwitcher.animate().cancel(); mSwitcher.animate().cancel(); @@ -564,6 +612,9 @@ public class CameraControls extends RotatableLayout { } else { mHdrSwitcher.animate().translationYBy(-mSize).setDuration(ANIME_DURATION); } + if (mIsBokehMode) { + mBokehSwitcher.animate().translationYBy(-mSize).setDuration(ANIME_DURATION); + } mSceneModeSwitcher.animate().translationYBy(-mSize).setDuration(ANIME_DURATION); mFilterModeSwitcher.animate().translationYBy(-mSize).setDuration(ANIME_DURATION); mMenu.animate().translationYBy(-mSize).setDuration(ANIME_DURATION); @@ -583,6 +634,9 @@ public class CameraControls extends RotatableLayout { } else { mHdrSwitcher.animate().translationXBy(-mSize).setDuration(ANIME_DURATION); } + if (mIsBokehMode) { + mBokehSwitcher.animate().translationXBy(-mSize).setDuration(ANIME_DURATION); + } mSceneModeSwitcher.animate().translationXBy(-mSize).setDuration(ANIME_DURATION); mFilterModeSwitcher.animate().translationXBy(-mSize).setDuration(ANIME_DURATION); mMenu.animate().translationXBy(-mSize).setDuration(ANIME_DURATION); @@ -602,6 +656,9 @@ public class CameraControls extends RotatableLayout { } else { mHdrSwitcher.animate().translationYBy(mSize).setDuration(ANIME_DURATION); } + if (mIsBokehMode) { + mBokehSwitcher.animate().translationYBy(mSize).setDuration(ANIME_DURATION); + } mSceneModeSwitcher.animate().translationYBy(mSize).setDuration(ANIME_DURATION); mFilterModeSwitcher.animate().translationYBy(mSize).setDuration(ANIME_DURATION); mMenu.animate().translationYBy(mSize).setDuration(ANIME_DURATION); @@ -621,6 +678,9 @@ public class CameraControls extends RotatableLayout { } else { mHdrSwitcher.animate().translationXBy(mSize).setDuration(ANIME_DURATION); } + if (mIsBokehMode) { + mBokehSwitcher.animate().translationXBy(-mSize).setDuration(ANIME_DURATION); + } mSceneModeSwitcher.animate().translationXBy(mSize).setDuration(ANIME_DURATION); mFilterModeSwitcher.animate().translationXBy(mSize).setDuration(ANIME_DURATION); mMenu.animate().translationXBy(mSize).setDuration(ANIME_DURATION); @@ -649,6 +709,9 @@ public class CameraControls extends RotatableLayout { } else { mHdrSwitcher.animate().cancel(); } + if (mIsBokehMode) { + mBokehSwitcher.animate().cancel(); + } mSceneModeSwitcher.animate().cancel(); mFilterModeSwitcher.animate().cancel(); mSwitcher.animate().cancel(); @@ -683,6 +746,9 @@ public class CameraControls extends RotatableLayout { } else { mHdrSwitcher.animate().translationYBy(mSize).setDuration(ANIME_DURATION); } + if (mIsBokehMode) { + mBokehSwitcher.animate().translationYBy(mSize).setDuration(ANIME_DURATION); + } mSceneModeSwitcher.animate().translationYBy(mSize).setDuration(ANIME_DURATION); mFilterModeSwitcher.animate().translationYBy(mSize).setDuration(ANIME_DURATION); mMenu.animate().translationYBy(mSize).setDuration(ANIME_DURATION); @@ -704,6 +770,9 @@ public class CameraControls extends RotatableLayout { } else { mHdrSwitcher.animate().translationXBy(mSize).setDuration(ANIME_DURATION); } + if (mIsBokehMode) { + mBokehSwitcher.animate().translationXBy(mSize).setDuration(ANIME_DURATION); + } mSceneModeSwitcher.animate().translationXBy(mSize).setDuration(ANIME_DURATION); mFilterModeSwitcher.animate().translationXBy(mSize).setDuration(ANIME_DURATION); mMenu.animate().translationXBy(mSize).setDuration(ANIME_DURATION); @@ -725,6 +794,9 @@ public class CameraControls extends RotatableLayout { } else { mHdrSwitcher.animate().translationYBy(-mSize).setDuration(ANIME_DURATION); } + if (mIsBokehMode) { + mBokehSwitcher.animate().translationYBy(-mSize).setDuration(ANIME_DURATION); + } mSceneModeSwitcher.animate().translationYBy(-mSize).setDuration(ANIME_DURATION); mFilterModeSwitcher.animate().translationYBy(-mSize).setDuration(ANIME_DURATION); mMenu.animate().translationYBy(-mSize).setDuration(ANIME_DURATION); @@ -746,6 +818,9 @@ public class CameraControls extends RotatableLayout { } else { mHdrSwitcher.animate().translationXBy(-mSize).setDuration(ANIME_DURATION); } + if (mIsBokehMode) { + mBokehSwitcher.animate().translationXBy(-mSize).setDuration(ANIME_DURATION); + } mSceneModeSwitcher.animate().translationXBy(-mSize).setDuration(ANIME_DURATION); mFilterModeSwitcher.animate().translationXBy(-mSize).setDuration(ANIME_DURATION); mMenu.animate().translationXBy(-mSize).setDuration(ANIME_DURATION); @@ -1024,7 +1099,7 @@ public class CameraControls extends RotatableLayout { mOrientation = orientation; View[] views = { mSceneModeSwitcher, mFilterModeSwitcher, mFrontBackSwitcher, - TsMakeupManager.HAS_TS_MAKEUP ? mTsMakeupSwitcher : mHdrSwitcher, + TsMakeupManager.HAS_TS_MAKEUP ? mTsMakeupSwitcher : mHdrSwitcher,mBokehSwitcher, mMenu, mShutter, mPreview, mSwitcher, mMute, mReviewRetakeButton, mReviewCancelButton, mReviewDoneButton, mExitPanorama }; @@ -1044,6 +1119,9 @@ public class CameraControls extends RotatableLayout { } else { mHdrSwitcher.setVisibility(View.INVISIBLE); } + if (mIsBokehMode) { + mBokehSwitcher.setVisibility(View.INVISIBLE); + } mSceneModeSwitcher.setVisibility(View.INVISIBLE); mFilterModeSwitcher.setVisibility(View.INVISIBLE); mMenu.setVisibility(View.INVISIBLE); @@ -1056,6 +1134,9 @@ public class CameraControls extends RotatableLayout { } else { mHdrSwitcher.setVisibility(View.VISIBLE); } + if (mIsBokehMode) { + mBokehSwitcher.setVisibility(View.VISIBLE); + } mSceneModeSwitcher.setVisibility(View.VISIBLE); mFilterModeSwitcher.setVisibility(View.VISIBLE); mMenu.setVisibility(View.VISIBLE); diff --git a/src/com/android/camera/ui/PieRenderer.java b/src/com/android/camera/ui/PieRenderer.java index 3712de1b7..323973301 100644..100755 --- a/src/com/android/camera/ui/PieRenderer.java +++ b/src/com/android/camera/ui/PieRenderer.java @@ -21,6 +21,9 @@ import android.animation.Animator.AnimatorListener; import android.animation.ValueAnimator; import android.content.Context; import android.content.res.Resources; +import android.content.res.TypedArray; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; @@ -28,13 +31,21 @@ import android.graphics.Path; import android.graphics.Point; import android.graphics.PointF; import android.graphics.RectF; +import android.graphics.drawable.Drawable; import android.os.Handler; import android.os.Message; import android.util.FloatMath; +import android.util.Log; +import android.util.Size; import android.view.MotionEvent; +import android.view.View; import android.view.ViewConfiguration; +import android.view.ViewGroup; import android.view.animation.Animation; import android.view.animation.Transformation; +import android.widget.FrameLayout; +import android.widget.LinearLayout; +import android.widget.SeekBar; import com.android.camera.CameraActivity; import com.android.camera.drawable.TextDrawable; @@ -82,6 +93,7 @@ public class PieRenderer extends OverlayRenderer private static final int MSG_OPEN = 0; private static final int MSG_CLOSE = 1; private static final int MSG_OPENSUBMENU = 2; + private static final int MSG_MOVED = 3; protected static float CENTER = (float) Math.PI / 2; protected static float RAD24 = (float)(24 * Math.PI / 180); @@ -147,25 +159,35 @@ public class PieRenderer extends OverlayRenderer private int mDeadZone; private int mAngleZone; private float mCenterAngle; + private boolean mIsBokehMode = false; + private TypedArray mBokehFocusResId; + private Bitmap mBokehFocusCircle; + private int mBokehFocusIndex = 0; + private ProgressRenderer mProgressRenderer; private Handler mHandler = new Handler() { public void handleMessage(Message msg) { switch(msg.what) { - case MSG_OPEN: - if (mListener != null) { - mListener.onPieOpened(mPieCenterX, mPieCenterY); - } - break; - case MSG_CLOSE: - if (mListener != null) { - mListener.onPieClosed(); - } - break; - case MSG_OPENSUBMENU: - onEnterOpen(); - break; + case MSG_OPEN: + if (mListener != null) { + mListener.onPieOpened(mPieCenterX, mPieCenterY); + } + break; + case MSG_CLOSE: + if (mListener != null) { + mListener.onPieClosed(); + } + break; + case MSG_OPENSUBMENU: + onEnterOpen(); + break; + case MSG_MOVED: + if (mListener != null) { + mListener.onPieMoved(mFocusX, mFocusY); + } + break; } } @@ -176,6 +198,7 @@ public class PieRenderer extends OverlayRenderer static public interface PieListener { public void onPieOpened(int centerX, int centerY); public void onPieClosed(); + public void onPieMoved(int centerX,int centerY); } public void setPieListener(PieListener pl) { @@ -248,6 +271,55 @@ public class PieRenderer extends OverlayRenderer getRoot().addItem(item); } + public void setBokehMode(boolean enable) { + mIsBokehMode = enable; + if (mIsBokehMode){ + mBokehFocusResId = getContext().getResources().obtainTypedArray( + R.array.bokeh_shutter_icons); + int resid = mBokehFocusResId.getResourceId(mBokehFocusIndex,0); + mBokehFocusCircle = BitmapFactory.decodeResource(getContext().getResources(),resid); + } else { + if (mBokehFocusCircle != null) + mBokehFocusCircle.recycle(); + } + mOverlay.update(); + } + + public void setBokehDegree(int degree) { + if (degree >=0 && degree <= 100) { + int index = (int)degree/15; + Log.d("ZJJ","index="+index); + if (mBokehFocusIndex == index) + return; + mBokehFocusIndex = index; + int resid = mBokehFocusResId.getResourceId(mBokehFocusIndex,0); + Log.d("ZJJ","resid = "+resid ); + if (mBokehFocusCircle != null) { + mBokehFocusCircle.recycle(); + } + mBokehFocusCircle = BitmapFactory.decodeResource(getContext().getResources(),resid); + mOverlay.update(); + } + } + + public Size getBokehFocusSize() { + if (mIsBokehMode && mBokehFocusCircle != null) { + return new Size(mBokehFocusCircle.getWidth(),mBokehFocusCircle.getHeight()); + } + return new Size(0,0); + } + + private void drawBokehFocus(Canvas canvas) { + if (mBokehFocusCircle != null) { + float x = mFocusX-mBokehFocusCircle.getWidth()/2; + float y = mFocusY-mBokehFocusCircle.getHeight()/2; + canvas.drawBitmap( + mBokehFocusCircle,x,y,new Paint()); + } + mHandler.sendEmptyMessage(MSG_MOVED); + return; + } + public void clearItems() { getRoot().clearItems(); } @@ -307,7 +379,12 @@ public class PieRenderer extends OverlayRenderer mLabel.setText(""); } } - setVisible(show); + if (mIsBokehMode) { + setVisible(true); + } else { + setVisible(show); + } + mHandler.sendEmptyMessage(show ? MSG_OPEN : MSG_CLOSE); } @@ -535,7 +612,6 @@ public class PieRenderer extends OverlayRenderer @Override public void onDraw(Canvas canvas) { mProgressRenderer.onDraw(canvas, mFocusX, mFocusY); - float alpha = 1; if (mXFade != null) { alpha = (Float) mXFade.getAnimatedValue(); @@ -549,8 +625,12 @@ public class PieRenderer extends OverlayRenderer float sf = 0.9f + alpha * 0.1f; canvas.scale(sf, sf, mPieCenterX, mPieCenterY); } - if (mState != STATE_PIE) { - drawFocus(canvas); + if (mIsBokehMode) { + drawBokehFocus(canvas); + } else { + if (mState != STATE_PIE) { + drawFocus(canvas); + } } if (mState == STATE_FINISHING) { canvas.restoreToCount(state); @@ -1109,7 +1189,7 @@ public class PieRenderer extends OverlayRenderer private class Disappear implements Runnable { @Override public void run() { - if (mState == STATE_PIE) return; + if (mState == STATE_PIE || mIsBokehMode) return; setVisible(false); mFocusX = mCenterX; mFocusY = mCenterY; |