FaceView.java revision d480002ccad05cf992c628c72884091c36cc654c
141ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li/* 241ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li * Copyright (C) 2011 The Android Open Source Project 341ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li * 441ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li * Licensed under the Apache License, Version 2.0 (the "License"); 541ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li * you may not use this file except in compliance with the License. 641ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li * You may obtain a copy of the License at 741ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li * 841ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li * http://www.apache.org/licenses/LICENSE-2.0 941ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li * 1041ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li * Unless required by applicable law or agreed to in writing, software 1141ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li * distributed under the License is distributed on an "AS IS" BASIS, 1241ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1341ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li * See the License for the specific language governing permissions and 1441ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li * limitations under the License. 1541ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li */ 1641ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li 1741ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Lipackage com.android.camera.ui; 1841ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li 1941ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Liimport com.android.camera.R; 2041ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Liimport com.android.camera.Util; 2141ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li 2241ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Liimport android.content.Context; 2341ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Liimport android.graphics.Canvas; 2441ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Liimport android.graphics.Matrix; 2541ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Liimport android.graphics.RectF; 2641ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Liimport android.graphics.drawable.Drawable; 2741ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Liimport android.hardware.Camera.Face; 2841ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Liimport android.util.AttributeSet; 2941ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Liimport android.util.Log; 3041ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Liimport android.view.View; 3141ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li 3241ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Lipublic class FaceView extends View { 3341ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li private final String TAG = "FaceView"; 3441ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li private final boolean LOGV = false; 3541ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li private int mDisplayOrientation; 3641ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li private boolean mMirror; 37d480002ccad05cf992c628c72884091c36cc654cWu-cheng Li private boolean mPause; 3841ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li private Matrix mMatrix = new Matrix(); 3941ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li private RectF mRect = new RectF(); 4041ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li private Face[] mFaces; 4141ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li private Drawable mFaceRect; 4241ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li 4341ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li public FaceView(Context context, AttributeSet attrs) { 4441ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li super(context, attrs); 4541ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li mFaceRect = getResources().getDrawable(R.drawable.focus_focused); 4641ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li } 4741ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li 4841ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li public void setFaces(Face[] faces) { 4941ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li if (LOGV) Log.v(TAG, "Num of faces=" + faces.length); 50d480002ccad05cf992c628c72884091c36cc654cWu-cheng Li if (mPause) return; 5141ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li mFaces = faces; 5241ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li invalidate(); 5341ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li } 5441ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li 5541ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li public void setDisplayOrientation(int orientation) { 5641ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li mDisplayOrientation = orientation; 5741ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li if (LOGV) Log.v(TAG, "mDisplayOrientation=" + orientation); 5841ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li } 5941ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li 6041ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li public void setMirror(boolean mirror) { 6141ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li mMirror = mirror; 6241ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li if (LOGV) Log.v(TAG, "mMirror=" + mirror); 6341ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li } 6441ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li 6541ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li public boolean faceExists() { 6641ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li return (mFaces != null && mFaces.length > 0); 6741ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li } 6841ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li 6941ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li public void clearFaces() { 7041ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li mFaces = null; 7141ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li invalidate(); 7241ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li } 7341ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li 74d480002ccad05cf992c628c72884091c36cc654cWu-cheng Li public void pause() { 75d480002ccad05cf992c628c72884091c36cc654cWu-cheng Li mPause = true; 76d480002ccad05cf992c628c72884091c36cc654cWu-cheng Li } 77d480002ccad05cf992c628c72884091c36cc654cWu-cheng Li 78d480002ccad05cf992c628c72884091c36cc654cWu-cheng Li public void resume() { 79d480002ccad05cf992c628c72884091c36cc654cWu-cheng Li mPause = false; 80d480002ccad05cf992c628c72884091c36cc654cWu-cheng Li } 81d480002ccad05cf992c628c72884091c36cc654cWu-cheng Li 8241ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li private void dumpRect(RectF rect, String msg) { 8341ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li Log.v(TAG, msg + "=(" + rect.left + "," + rect.top 8441ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li + "," + rect.right + "," + rect.bottom + ")"); 8541ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li } 8641ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li 8741ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li @Override 8841ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li protected void onDraw(Canvas canvas) { 8941ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li if (mFaces != null && mFaces.length > 0) { 9041ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li // Prepare the matrix. 9141ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li Util.prepareMatrix(mMatrix, mMirror, mDisplayOrientation, getWidth(), 9241ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li getHeight()); 9341ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li 9441ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li for (int i = 0; i < mFaces.length; i++) { 9541ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li // Transform the coordinates. 9641ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li mRect.set(mFaces[i].rect); 9741ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li if (LOGV) dumpRect(mRect, "Original rect"); 9841ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li mMatrix.mapRect(mRect); 9941ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li if (LOGV) dumpRect(mRect, "Transformed rect"); 10041ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li 10141ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li mFaceRect.setBounds(Math.round(mRect.left), Math.round(mRect.top), 10241ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li Math.round(mRect.right), Math.round(mRect.bottom)); 10341ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li mFaceRect.draw(canvas); 10441ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li } 10541ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li } 10641ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li super.onDraw(canvas); 10741ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li } 10841ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li} 109