Android(安卓)浏览图片层叠放大效果(CoverFlow)
16lz
2021-12-04
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>
更多相关文章
- Android中摇一摇效果的实现
- Android(安卓)带阻尼回弹效果的ScorllView
- 使用android自带的SwipeRefreshLayout实现下拉刷新
- 初学Android,FrameLayout霓虹灯效果(五)
- android开机自启广播无效果的曲线解决方案
- Android图像处理之冰冻效果
- Android之Fragment界面布局实例
- ch08 Android(安卓)Intent
- Android中登录布局展示Activity