package com.putao.game.majiang.util;
import com.putao.game.majiang.data.AppData;
import com.putao.game.majiang.data.User;
import android.content.Context;
import android.graphics.Camera;
import android.graphics.Canvas;
import android.graphics.Matrix;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import android.view.animation.Animation;
import android.view.animation.Transformation;
import android.widget.Gallery;
/**
* 类功能描述:</br>
*
* @author 兰唯
* @version 1.0 </p> 修改时间:</br> 修改备注:</br>
*/
public class CustomGallery extends Gallery {
public Camera mCamera = new Camera();
Matrix mMatrix = new Matrix();
public CustomGallery(Context context) {
super(context);
setStaticTransformationsEnabled(true);
}
public CustomGallery(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
public CustomGallery(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
protected boolean getChildStaticTransformation(View child, Transformation t) {
t.clear();
t.setTransformationType(Transformation.TYPE_MATRIX);
final float offset = calculateOffsetOfCenter(child);
transformViewRoom(child, t, offset);
return true;
}
protected int getCenterOfCoverflow() {
return ((getWidth() - getPaddingLeft() - getPaddingRight()) >> 1) + getPaddingLeft();
}
// 获取 child 中心点 X 的位置
protected int getCenterOfView(View view) {
return view.getLeft() + (view.getWidth() >> 1);
}
// 计算 child 偏离 父控件中心的 offset 值, -1 <= offset <= 1
protected float calculateOffsetOfCenter(View view) {
final int pCenter = getCenterOfCoverflow();
final int cCenter = getCenterOfView(view);
float offset = (cCenter - pCenter) / (pCenter * 1.0f);
offset = Math.min(offset, 0.3f);
offset = Math.max(offset, -0.3f);
return offset;
}
void transformViewRoom(View child, Transformation t, float race) {
User userInfo = AppData.getInstance().getUser();
Camera mCamera = new Camera();
mCamera.save();
final Matrix matrix = t.getMatrix();
final int halfHeight = child.getMeasuredHeight() >> 1;
final int halfWidth = child.getMeasuredWidth() >> 1;
// 平移 X、Y、Z 轴已达到立体效果
mCamera.translate(-race * 50, 0.0f, Math.abs(race) * 200);
// 也可设置旋转效果
mCamera.getMatrix(matrix);
// 获取当前屏幕的宽高来缩小当前的item
if (userInfo.getWidth() == 800 && userInfo.getHeight() == 480) {
matrix.postScale(0.9f, 0.9f);
}
// 以 child 的中心点变换
matrix.preTranslate(-halfWidth, -halfHeight);
matrix.postTranslate(halfWidth, halfHeight);
mCamera.restore();
// 设置 alpha 变换
t.setAlpha(1 - Math.abs(race));
}
@Override
protected boolean drawChild(Canvas canvas, View child, long drawingTime) {
if (android.os.Build.VERSION.SDK_INT > 15) {
if (child.getAnimation() == null) {
TransformationAnimation ta = new TransformationAnimation(child);
child.setAnimation(ta);
}
}
return super.drawChild(canvas, child, drawingTime);
}
final class TransformationAnimation extends Animation {
View v;
TransformationAnimation(View _v) {
v = _v;
}
@Override
protected void applyTransformation(float interpolatedTime, Transformation t) {
super.applyTransformation(interpolatedTime, t);
getChildStaticTransformation(v, t);
}
}
void getTransformationMatrix(View child, float offset) {
final int halfWidth = child.getLeft() + (child.getMeasuredWidth() >> 1);
final int halfHeight = child.getMeasuredHeight() >> 1;
mCamera.save();
mCamera.translate(-offset * 50, 0.0f, Math.abs(offset) * 200);
mCamera.getMatrix(mMatrix);
mCamera.restore();
mMatrix.preTranslate(-halfWidth, -halfHeight);
mMatrix.postTranslate(halfWidth, halfHeight);
}
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
/**
* return false; 只可以滑动一张图片
* */
return super.onFling(e1, e2, velocityX, velocityY);
}
}
[size=x-small][/size]
分享到:
相关推荐
在Android开发中,有时我们可能需要自定义Gallery组件来满足特定的设计需求,因为原生的Gallery组件在某些情况下并不能提供完全符合我们预期的展示效果。本篇将详细讲解如何使用HorizontalScrollView来创建一个...
"android自定义gallery"项目就是一个很好的示例,它实现了左右滑动浏览图片的功能,并且带有当前选中图片位置的指示点,这种设计常见于应用启动时的向导页面。下面将详细介绍这个项目的知识点。 1. **自定义...
本篇文章主要介绍如何使用自定义的Gallery控件,实现3D效果的图片浏览器的效果。 话不多说,先看效果。 上面是一个自定义的Gallery控件,实现倒影和仿3D的效果,下面是一个图片查看器,点击上面的小图片,可以在...
接下来,为了测试和演示我们的自定义`Gallery`,我们可以创建一个简单的Android项目,包含一个主Activity和布局文件。在布局文件中,添加自定义的`MyGallery1`控件,并在Activity的`onCreate()`方法中设置数据源和...
总的来说,自定义`Android Gallery`不仅提升了用户体验,还展示了Android开发中的灵活性。从自定义边框到动态的底部指示器,再到自动切换功能,这些都是提升用户界面交互性的重要手段。在实际开发中,我们应该根据...
在Android开发中,`Gallery`和`TabHost`是两种常用的UI组件,它们可以用于创建丰富多样的用户界面。在这个项目中,`Android 使用Gallery_tabhost实现标签效果图源码.rar`是一个示例,展示了如何结合这两个组件来创建...
"android自定义3d画廊效果"是一个专为Android平台设计的特色功能,它通过实现3D视角的图片滚动效果,为用户提供了新颖且引人入胜的交互体验。这个3D Gallery效果的实现基于对Android系统的深入理解和熟练运用,主要...
在Android开发中,...总的来说,Android自定义ListView与Gallery组合的实现涉及到了数据绑定、视图复用、事件监听等多个核心知识点,通过熟练掌握这些技能,开发者可以构建出功能强大、用户体验优良的Android应用。
这篇博客文章 "Android自定义控件(3D画廊)" 提供了一个实现这种效果的教程,下面将详细讲解相关知识点。 1. **自定义控件基础**:Android系统允许开发者创建自己的视图组件,通过继承现有的View或ViewGroup类,...
android 自定义gridView 按日期显示图片和视频 galleryDemo android 自定义gridView 按日期显示图片和视频 galleryDemo android 自定义gridView 按日期显示图片和视频 galleryDemo 免费下载 给个好评!
Android 自定义 HorizontalScrollView 打造超强 Gallery效果 完整实例源码 Android 自定义 HorizontalScrollView 打造超强 Gallery效果 完整实例源码 Android 自定义 HorizontalScrollView 打造超强 Gallery效果 ...
实现的原理是 添加一ImageAdapter并设置给Gallery对象,设置一个itemclickListener并Toast被点击图片的位置,然后改写BaseAdapter自定义一ImageAdapter class ,创建ImageAdapter的构造器,取得Gallery属性的Index...
本示例代码着重于如何通过自定义RecyclerView实现一个类似于Android原生Gallery的效果,即横向滑动浏览图片。Gallery组件在Android API 21(Lollipop)之后已被弃用,因此开发者需要寻找替代方案,例如使用...
原生的Android SDK提供了Gallery组件,但自Android 3.0(API级别11)起,Gallery已被弃用,推荐使用HorizontalScrollView或RecyclerView等替代品。本文将深入探讨如何使用自定义的HorizontalScrollView来实现类似...
Android Gallery 自定义ImageView和Gallery实现图片浏览功能,类似Android图库软件,主要实现的功能有:图片左右滑动、放大缩小、放大弹回、缩小弹回。 一开始使用Viewpager实现图片浏览,发现两张图片滑动时没有...
要使用GridView实现自定义Gallery功能,我们首先需要创建一个自定义的Adapter。Adapter是连接数据源和UI组件的关键,它负责将数据转化为视图并填充到GridView中。这里我们需要一个继承自BaseAdapter的自定义Adapter...
本文将详细探讨如何实现一个"Android自定义带倒影和偏转的超炫Gallery",该Gallery组件能展示出极具视觉冲击力的效果。 首先,让我们了解一下Android中的Gallery组件。Gallery是Android提供的一个特殊的视图,它...
这个“Android自定义横向列表GalleryImage完整app源码”就是一个很好的示例,它提供了如何实现这样一个功能的具体代码。下面将详细解释相关知识点。 1. **自定义控件**: 自定义控件是Android开发中常见的一种技术...