FaceView.java revision 41ecefdc167ca88d785e6a1d58b706cc7f03c2bd
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; 3741ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li private Matrix mMatrix = new Matrix(); 3841ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li private RectF mRect = new RectF(); 3941ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li private Face[] mFaces; 4041ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li private Drawable mFaceRect; 4141ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li 4241ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li public FaceView(Context context, AttributeSet attrs) { 4341ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li super(context, attrs); 4441ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li mFaceRect = getResources().getDrawable(R.drawable.focus_focused); 4541ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li } 4641ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li 4741ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li public void setFaces(Face[] faces) { 4841ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li if (LOGV) Log.v(TAG, "Num of faces=" + faces.length); 4941ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li mFaces = faces; 5041ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li invalidate(); 5141ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li } 5241ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li 5341ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li public void setDisplayOrientation(int orientation) { 5441ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li mDisplayOrientation = orientation; 5541ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li if (LOGV) Log.v(TAG, "mDisplayOrientation=" + orientation); 5641ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li } 5741ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li 5841ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li public void setMirror(boolean mirror) { 5941ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li mMirror = mirror; 6041ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li if (LOGV) Log.v(TAG, "mMirror=" + mirror); 6141ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li } 6241ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li 6341ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li public boolean faceExists() { 6441ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li return (mFaces != null && mFaces.length > 0); 6541ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li } 6641ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li 6741ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li public void clearFaces() { 6841ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li mFaces = null; 6941ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li invalidate(); 7041ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li } 7141ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li 7241ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li private void dumpRect(RectF rect, String msg) { 7341ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li Log.v(TAG, msg + "=(" + rect.left + "," + rect.top 7441ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li + "," + rect.right + "," + rect.bottom + ")"); 7541ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li } 7641ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li 7741ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li @Override 7841ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li protected void onDraw(Canvas canvas) { 7941ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li if (mFaces != null && mFaces.length > 0) { 8041ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li // Prepare the matrix. 8141ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li Util.prepareMatrix(mMatrix, mMirror, mDisplayOrientation, getWidth(), 8241ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li getHeight()); 8341ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li 8441ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li for (int i = 0; i < mFaces.length; i++) { 8541ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li // Transform the coordinates. 8641ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li mRect.set(mFaces[i].rect); 8741ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li if (LOGV) dumpRect(mRect, "Original rect"); 8841ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li mMatrix.mapRect(mRect); 8941ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li if (LOGV) dumpRect(mRect, "Transformed rect"); 9041ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li 9141ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li mFaceRect.setBounds(Math.round(mRect.left), Math.round(mRect.top), 9241ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li Math.round(mRect.right), Math.round(mRect.bottom)); 9341ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li mFaceRect.draw(canvas); 9441ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li } 9541ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li } 9641ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li super.onDraw(canvas); 9741ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li } 9841ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li} 99