import java.util.HashMap;import java.util.Map;import android.content.Context;import android.graphics.Camera;import android.graphics.Matrix;import android.graphics.Rect;import android.media.AudioManager;import android.media.SoundPool;import android.os.Bundle;import android.util.AttributeSet;import android.util.Log;import android.view.View;import android.view.animation.Transformation;import android.widget.Gallery; public class CoverFlow extends Gallery {// mCamera是用来做类3D效果处理,比如Z轴方向上的平移,绕Y轴的旋转等private Camera mCamera = new Camera();// mMaxRotationAngle是图片绕Y轴最大旋转角度,也就是屏幕最边上那两张图片的旋转角度private int mMaxRotationAngle = 50;// mMaxZoom是图片在Z轴平移的距离,视觉上看上进心来就是放大缩小的效果private int mMaxZoom = -200;private int mCoveflowCenter;private boolean mAlphaMode = true;private boolean mCircleMode = true;private SoundPool soundPool;  private int curSlection = 2;    Map<Integer, Integer> soundMap = new HashMap<Integer, Integer>(); public CoverFlow(Context context) {super(context);// TODO Auto-generated constructor stubthis.setStaticTransformationsEnabled(true);initSoundMap(context);}public CoverFlow(Context context, AttributeSet attrs) {super(context, attrs);this.setStaticTransformationsEnabled(true);initSoundMap(context);}public CoverFlow(Context context, AttributeSet attrs, int defStyle) {super(context, attrs, defStyle);this.setStaticTransformationsEnabled(true);initSoundMap(context);}private void initSoundMap(Context context){// 创建 SoundPool对象设置最多容纳10个音频。音频的品质为5           soundPool = new SoundPool(10, AudioManager.STREAM_SYSTEM, 5);          // load方法加载音频文件返回对应的ID           soundMap.put(1, soundPool.load(context, R.raw.wheel, 1));}public int getMaxRotationAngle() {return mMaxRotationAngle;}public void setMaxRotationAngle(int maxRotationAngle) {mMaxRotationAngle = maxRotationAngle;}public boolean getCircleMode() {return mCircleMode;}public void setCircleMode(boolean isCircle) {mCircleMode = isCircle;}public boolean getAlphaMode() {return mAlphaMode;}public void setAlphaMode(boolean isAlpha) {mAlphaMode = isAlpha;}public int getMaxZoom() {return mMaxZoom;}public void setMaxZoom(int maxZoom) {mMaxZoom = maxZoom;}private int getCenterOfCoverflow() {return (getWidth() - getPaddingLeft() - getPaddingRight()) / 2+ getPaddingLeft();}// 获取视图中心private static int getCenterOfView(View view) {return view.getLeft() + view.getWidth() / 2;}@Overrideprotected void onFocusChanged(boolean gainFocus, int direction,Rect previouslyFocusedRect) {Log.e("ssss","onFocusChanged");// TODO Auto-generated method stubsuper.onFocusChanged(gainFocus, direction, previouslyFocusedRect);}// 重写Garray方法 ,产生层叠和放大效果@Overrideprotected boolean getChildStaticTransformation(View child, Transformation t) {// TODO Auto-generated method stubfinal int childCenter = getCenterOfView(child);final int childWidth = child.getWidth();int rotationAngle = 0;t.clear();t.setTransformationType(Transformation.TYPE_MATRIX);if (childCenter == mCoveflowCenter) {transformImageBitmap(child, t, 0, 0);} else {rotationAngle = (int) (((float) (mCoveflowCenter - childCenter) / childWidth) * mMaxRotationAngle);transformImageBitmap(child,t,rotationAngle,(int) Math.floor((mCoveflowCenter - childCenter)/ (childWidth == 0 ? 1 : childWidth)));}return true;}/** * This is called during layout when the size of this view has changed. If * you were just added to the view hierarchy, you're called with the old * values of 0. */protected void onSizeChanged(int w, int h, int oldw, int oldh) {mCoveflowCenter = getCenterOfCoverflow();super.onSizeChanged(w, h, oldw, oldh);}/** * Transform the Image Bitmap by the Angle passed */private void transformImageBitmap(View child, Transformation t,int rotationAngle, int d) {mCamera.save();child.setLayerType(View.LAYER_TYPE_SOFTWARE,null);child.setRotation(-mTargetDegree);final Matrix imageMatrix = t.getMatrix();final int imageHeight = child.getLayoutParams().height;final int imageWidth = child.getLayoutParams().width;final int rotation = Math.abs(rotationAngle);// mCamera.translate(0.0f, 0.0f, 100.0f);// As the angle of the view gets less, zoom in// if (rotation <= mMaxRotationAngle) {float zoomAmount = (float) (-140 + (rotation * 2));if (rotationAngle < 0) {mCamera.translate((float) (-rotation * 0.5),/*(float) (-rotation * 0.3) + 5*/0, zoomAmount);} else {mCamera.translate((float) rotation, /*(float) (-rotation * 0.3) + 5*/0,zoomAmount);}Log.i("info", "---------------------->" + rotationAngle);if (mCircleMode) {//if (rotation < 40) {//mCamera.translate(0.0f, (100 - rotation * 2.5f), 0.0f);//} else {mCamera.translate(0.0f, (50 - rotation * 1.5f), 0.0f);//}}// }// mCamera.rotateY(rotationAngle);mCamera.getMatrix(imageMatrix);imageMatrix.preTranslate(-(imageWidth / 2), -(imageHeight / 2));imageMatrix.postTranslate((imageWidth / 2), (imageHeight / 2));mCamera.restore();}// 重载视图显示顺序让左到中间显示,再到右到中间显示protected int getChildDrawingOrder(int childCount, int i) { // Current selected index.        int selectedIndex = getSelectedItemPosition() - getFirstVisiblePosition();        //播放声音//Log.e("ssss","curSlection="+curSlection+" getSelectedItemPosition()="+getSelectedItemPosition());        if(curSlection != getSelectedItemPosition()){        soundPool.play(soundMap.get(1), 1, 1, 1, 0, 1);  curSlection = getSelectedItemPosition();        }                       if (selectedIndex < 0)        {            return i;        }               if (i < selectedIndex)        {            return i;        }        else if (i >= selectedIndex)        {            return childCount - 1 - i + selectedIndex;        }        else        {            return i;        }/*long t = getSelectedItemId();int h = getSelectedItemPosition();Log.e("getChildDrawingOrder","i="+i+"  childCount="+childCount);if (i < childCount / 2 ) {return i;}return childCount - i - 1 + childCount / 2;*/}}


<com.android.camera.ui.CoverFlow     android:id="@+id/coverflow" android:layout_width="fill_parent" android:layout_height="fill_parent"android:gravity="center_vertical"android:spacing="-5dp"/><GridLayout android:id="@+id/mode_picker"    android:layout_width="match_parent"      android:layout_height="match_parent"      android:orientation="vertical"      android:columnCount="2"    android:rowCount="3"     ></GridLayout>


更多相关文章

  1. Android中摇一摇效果的实现
  2. Android(安卓)带阻尼回弹效果的ScorllView
  3. 使用android自带的SwipeRefreshLayout实现下拉刷新
  4. 初学Android,FrameLayout霓虹灯效果(五)
  5. android开机自启广播无效果的曲线解决方案
  6. Android图像处理之冰冻效果
  7. Android之Fragment界面布局实例
  8. ch08 Android(安卓)Intent
  9. Android中登录布局展示Activity

随机推荐

  1. Android仿微信录制语音
  2. Android(安卓)Intent Activity 跳转几种
  3. Android的Bitmap处理大图片解决方法
  4. Android解析如何获取SDCard 内存
  5. Android(安卓)N进入分屏代码分析二
  6. Android(安卓)EventBus简单使用
  7. 图片常用的控件
  8. activity 设置Theme.Dialog View高度
  9. apk 反编译源码 资源文件
  10. Android编程心得-JSON使用心得(二)