diff options
author | Romain Guy <romainguy@google.com> | 2011-02-23 19:46:33 -0800 |
---|---|---|
committer | Romain Guy <romainguy@google.com> | 2011-02-23 19:51:42 -0800 |
commit | 47b8adec3904535c8d8ce2b6e42ecd736f2d90ce (patch) | |
tree | 3aa0807a2963ea256c378bf7dd5200fac9f39484 | |
parent | 81904fa40b501d3907c086e7d4fdc4a3e25cd922 (diff) | |
download | frameworks_base-47b8adec3904535c8d8ce2b6e42ecd736f2d90ce.zip frameworks_base-47b8adec3904535c8d8ce2b6e42ecd736f2d90ce.tar.gz frameworks_base-47b8adec3904535c8d8ce2b6e42ecd736f2d90ce.tar.bz2 |
Add a new Camera API to control the camera's location
Change-Id: Id9a082d2def803eb527e1987875e0d8a22c6e8aa
-rw-r--r-- | api/current.xml | 36 | ||||
-rw-r--r-- | core/java/android/view/View.java | 4 | ||||
-rw-r--r-- | core/jni/android/graphics/Camera.cpp | 14 | ||||
-rw-r--r-- | graphics/java/android/graphics/Camera.java | 102 | ||||
-rw-r--r-- | tests/HwAccelerationTest/AndroidManifest.xml | 10 | ||||
-rw-r--r-- | tests/HwAccelerationTest/res/drawable-nodpi/large_photo.jpg | bin | 0 -> 311474 bytes | |||
-rw-r--r-- | tests/HwAccelerationTest/src/com/android/test/hwui/Animated3dActivity.java | 51 |
7 files changed, 209 insertions, 8 deletions
diff --git a/api/current.xml b/api/current.xml index a36f066..cd827a6 100644 --- a/api/current.xml +++ b/api/current.xml @@ -77585,6 +77585,23 @@ visibility="public" > </method> +<method name="rotate" + return="void" + abstract="false" + native="true" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="x" type="float"> +</parameter> +<parameter name="y" type="float"> +</parameter> +<parameter name="z" type="float"> +</parameter> +</method> <method name="rotateX" return="void" abstract="false" @@ -77635,6 +77652,23 @@ visibility="public" > </method> +<method name="setLocation" + return="void" + abstract="false" + native="true" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="x" type="float"> +</parameter> +<parameter name="y" type="float"> +</parameter> +<parameter name="z" type="float"> +</parameter> +</method> <method name="translate" return="void" abstract="false" @@ -266659,7 +266693,7 @@ deprecated="not deprecated" visibility="public" > -<parameter name="t" type="T"> +<parameter name="arg0" type="T"> </parameter> </method> </interface> diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java index ae06888..e00b9cd 100644 --- a/core/java/android/view/View.java +++ b/core/java/android/view/View.java @@ -5748,9 +5748,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback, Accessibility } mCamera.save(); mMatrix.preScale(mScaleX, mScaleY, mPivotX, mPivotY); - mCamera.rotateX(mRotationX); - mCamera.rotateY(mRotationY); - mCamera.rotateZ(-mRotation); + mCamera.rotate(mRotationX, mRotationY, -mRotation); mCamera.getMatrix(matrix3D); matrix3D.preTranslate(-mPivotX, -mPivotY); matrix3D.postTranslate(mPivotX + mTranslationX, mPivotY + mTranslationY); diff --git a/core/jni/android/graphics/Camera.cpp b/core/jni/android/graphics/Camera.cpp index 980003e..0d715fd 100644 --- a/core/jni/android/graphics/Camera.cpp +++ b/core/jni/android/graphics/Camera.cpp @@ -45,6 +45,18 @@ static void Camera_rotateZ(JNIEnv* env, jobject obj, float degrees) { v->rotateZ(SkFloatToScalar(degrees)); } +static void Camera_rotate(JNIEnv* env, jobject obj, jfloat x, jfloat y, jfloat z) { + Sk3DView* v = (Sk3DView*)env->GetIntField(obj, gNativeInstanceFieldID); + v->rotateX(SkFloatToScalar(x)); + v->rotateY(SkFloatToScalar(y)); + v->rotateZ(SkFloatToScalar(z)); +} + +static void Camera_setLocation(JNIEnv* env, jobject obj, jfloat x, jfloat y, jfloat z) { + Sk3DView* v = (Sk3DView*)env->GetIntField(obj, gNativeInstanceFieldID); + v->setCameraLocation(SkFloatToScalar(x), SkFloatToScalar(y), SkFloatToScalar(z)); +} + static void Camera_getMatrix(JNIEnv* env, jobject obj, int native_matrix) { Sk3DView* v = (Sk3DView*)env->GetIntField(obj, gNativeInstanceFieldID); v->getMatrix((SkMatrix*)native_matrix); @@ -79,6 +91,8 @@ static JNINativeMethod gCameraMethods[] = { { "rotateX", "(F)V", (void*)Camera_rotateX }, { "rotateY", "(F)V", (void*)Camera_rotateY }, { "rotateZ", "(F)V", (void*)Camera_rotateZ }, + { "rotate", "(FFF)V", (void*)Camera_rotate }, + { "setLocation", "(FFF)V", (void*)Camera_setLocation }, { "nativeGetMatrix", "(I)V", (void*)Camera_getMatrix }, { "nativeApplyToCanvas", "(I)V", (void*)Camera_applyToCanvas }, { "dotWithNormal", "(FFF)F", (void*)Camera_dotWithNormal } diff --git a/graphics/java/android/graphics/Camera.java b/graphics/java/android/graphics/Camera.java index 530655f..7ef35a9 100644 --- a/graphics/java/android/graphics/Camera.java +++ b/graphics/java/android/graphics/Camera.java @@ -16,24 +16,115 @@ package android.graphics; - +/** + * A camera instance can be used to compute 3D transformations and + * generate a matrix that can be applied, for instance, on a + * {@link Canvas}. + */ public class Camera { - + /** + * Creates a new camera, with empty transformations. + */ public Camera() { nativeConstructor(); } + /** + * Saves the camera state. Each save should be balanced + * with a call to {@link #restore()}. + * + * @see #save() + */ public native void save(); + + /** + * Restores the saved state, if any. + * + * @see #restore() + */ public native void restore(); + /** + * Applies a translation transform on all three axis. + * + * @param x The distance to translate by on the X axis + * @param y The distance to translate by on the Y axis + * @param z The distance to translate by on the Z axis + */ public native void translate(float x, float y, float z); + + /** + * Applies a rotation transform around the X axis. + * + * @param deg The angle of rotation around the X axis, in degrees + * + * @see #rotateY(float) + * @see #rotateZ(float) + * @see #rotate(float, float, float) + */ public native void rotateX(float deg); + + /** + * Applies a rotation transform around the Y axis. + * + * @param deg The angle of rotation around the Y axis, in degrees + * + * @see #rotateX(float) + * @see #rotateZ(float) + * @see #rotate(float, float, float) + */ public native void rotateY(float deg); + + /** + * Applies a rotation transform around the Z axis. + * + * @param deg The angle of rotation around the Z axis, in degrees + * + * @see #rotateX(float) + * @see #rotateY(float) + * @see #rotate(float, float, float) + */ public native void rotateZ(float deg); + /** + * Applies a rotation transform around all three axis. + * + * @param x The angle of rotation around the X axis, in degrees + * @param y The angle of rotation around the Y axis, in degrees + * @param z The angle of rotation around the Z axis, in degrees + * + * @see #rotateX(float) + * @see #rotateY(float) + * @see #rotateZ(float) + */ + public native void rotate(float x, float y, float z); + + /** + * Sets the location of the camera. The default location is set at + * 0, 0, -8. + * + * @param x The x location of the camera + * @param y The y location of the camera + * @param z The z location of the camera + */ + public native void setLocation(float x, float y, float z); + + /** + * Computes the matrix corresponding to the current transformation + * and copies it to the supplied matrix object. + * + * @param matrix The matrix to copy the current transforms into + */ public void getMatrix(Matrix matrix) { nativeGetMatrix(matrix.native_instance); } + + /** + * Computes the matrix corresponding to the current transformation + * and applies it to the specified Canvas. + * + * @param canvas The Canvas to set the transform matrix onto + */ public void applyToCanvas(Canvas canvas) { nativeApplyToCanvas(canvas.mNativeCanvas); } @@ -41,7 +132,11 @@ public class Camera { public native float dotWithNormal(float dx, float dy, float dz); protected void finalize() throws Throwable { - nativeDestructor(); + try { + nativeDestructor(); + } finally { + super.finalize(); + } } private native void nativeConstructor(); @@ -51,4 +146,3 @@ public class Camera { int native_instance; } - diff --git a/tests/HwAccelerationTest/AndroidManifest.xml b/tests/HwAccelerationTest/AndroidManifest.xml index ae7ec45..e82f9aa 100644 --- a/tests/HwAccelerationTest/AndroidManifest.xml +++ b/tests/HwAccelerationTest/AndroidManifest.xml @@ -397,6 +397,16 @@ </activity> <activity + android:name="Animated3dActivity" + android:label="_Animated 3d" + android:theme="@android:style/Theme.Translucent.NoTitleBar"> + <intent-filter> + <action android:name="android.intent.action.MAIN" /> + <category android:name="android.intent.category.LAUNCHER" /> + </intent-filter> + </activity> + + <activity android:name="SimplePathsActivity" android:label="_SimplePaths"> <intent-filter> diff --git a/tests/HwAccelerationTest/res/drawable-nodpi/large_photo.jpg b/tests/HwAccelerationTest/res/drawable-nodpi/large_photo.jpg Binary files differnew file mode 100644 index 0000000..e23dbb0 --- /dev/null +++ b/tests/HwAccelerationTest/res/drawable-nodpi/large_photo.jpg diff --git a/tests/HwAccelerationTest/src/com/android/test/hwui/Animated3dActivity.java b/tests/HwAccelerationTest/src/com/android/test/hwui/Animated3dActivity.java new file mode 100644 index 0000000..f632c83 --- /dev/null +++ b/tests/HwAccelerationTest/src/com/android/test/hwui/Animated3dActivity.java @@ -0,0 +1,51 @@ +/* + * Copyright (C) 2010 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.test.hwui; + +import android.animation.ObjectAnimator; +import android.app.Activity; +import android.content.Context; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.graphics.Camera; +import android.graphics.Canvas; +import android.graphics.Matrix; +import android.os.Bundle; +import android.view.View; +import android.widget.FrameLayout; +import android.widget.ImageView; + +@SuppressWarnings({"UnusedDeclaration"}) +public class Animated3dActivity extends Activity { + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + ImageView view = new ImageView(this); + view.setImageResource(R.drawable.large_photo); + + setContentView(view, new FrameLayout.LayoutParams( + FrameLayout.LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.MATCH_PARENT + )); + + ObjectAnimator animator = ObjectAnimator.ofFloat(view, "rotationY", 0.0f, 360.0f); + animator.setDuration(4000); + animator.setRepeatCount(ObjectAnimator.INFINITE); + animator.setRepeatMode(ObjectAnimator.REVERSE); + animator.start(); + } +} |