`

类似Chome的翻转效果

阅读更多

简单的demo,屏幕上下滑动翻转View,类似Android Chrome的效果

 

 

 

代码很简单,扩展一X轴旋转的动画RotateAnimationEX

package com.ray.animation;

import android.graphics.Camera;
import android.graphics.Matrix;
import android.util.Log;
import android.view.animation.Animation;
import android.view.animation.Transformation;

public class RotateAnimationEX extends Animation {

	private float mFromDegress, mToDegress;
	private float mCenterX, mCenterY;
	private Camera mCamera;
	private OnFlipListener mFlipListener;
	private boolean onFilpped;
	public RotateAnimationEX(float fromDegrees, float toDegrees, int centerX, int centerY) {
		mFromDegress = fromDegrees;
		mToDegress = toDegrees;
		mCenterX = centerX;
		mCenterY = centerY;
		mCamera = new Camera();
		onFilpped = false;
	}
	
	public void setFlipListener(OnFlipListener listener) {
		mFlipListener = listener;
	}

	@Override
	protected void applyTransformation(float interpolatedTime, Transformation t) {
		mCamera.save();
		float rotateAngle = mFromDegress + (mToDegress - mFromDegress)*interpolatedTime;
		Log.d("Trace", "angel" + rotateAngle);
		if (mFlipListener != null) {
			if (rotateAngle >= 90 && rotateAngle <=180
			|| rotateAngle <=-90 && rotateAngle >= -180) {
				if (!onFilpped) {
					mFlipListener.onFlip();
					onFilpped = true;
				}
			} 
		}
		mCamera.rotateX(rotateAngle);
		Matrix m = t.getMatrix();
		mCamera.getMatrix(m);
		m.preTranslate(-mCenterX, -mCenterY);
		m.postTranslate(mCenterX, mCenterY);
		mCamera.restore();
	}
	
	public interface OnFlipListener {
		void onFlip();
	}
}
 

一测试的ViewGroup:

package com.ray.animation;

import com.ray.animation.RotateAnimationEX.OnFlipListener;

import android.content.Context;
import android.graphics.Camera;
import android.graphics.Color;
import android.graphics.Matrix;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.Transformation;

public class TestViewGroup extends ViewGroup implements GestureDetector.OnGestureListener,
	OnFlipListener {

	public static final int MARGIN = 30;
	public static final int MAX_ROTATE_ANGLE = 90;
	private View mTestView;
	private RotateAnimationEX mRotaAnim;
	private GestureDetector mGestureDetector;
	private float rotateAngle = 0;
	private Camera mCamera;
	public TestViewGroup(Context context) {
		super(context);
		mTestView = new View(context);
		mTestView.setBackgroundColor(COLORS[0]);
		addView(mTestView);
		setStaticTransformationsEnabled(true);
		mGestureDetector = new GestureDetector(context,this);
		mCamera = new Camera();
	}
	
	@Override
	protected boolean getChildStaticTransformation(View child, Transformation t) {
		if (child == mTestView) {
			mCamera.save();
			Matrix m = t.getMatrix();
			mCamera.rotateX(rotateAngle);
			mCamera.getMatrix(m);
			m.preTranslate(-child.getWidth() / 2, -child.getHeight() / 2);
			m.postTranslate(child.getWidth() / 2, child.getHeight() / 2);
			mCamera.restore();
			return true;
		}
		return false;
	}



	@Override
	protected void onLayout(boolean changed, int l, int t, int r, int b) {
		mTestView.layout(l + MARGIN, t + MARGIN, r - MARGIN, b - MARGIN);
	}

	@Override
	public boolean onTouchEvent(MotionEvent event) {
		
		boolean retValue = mGestureDetector.onTouchEvent(event);
		
		if (event.getAction() == MotionEvent.ACTION_UP) {
			mRotaAnim = new RotateAnimationEX(rotateAngle, 180*rotateAngle/Math.abs(rotateAngle),
					mTestView.getWidth()/2, mTestView.getHeight()/2);
			mRotaAnim.setFlipListener(this);
			mRotaAnim.setDuration(700);
			mRotaAnim.setFillAfter(true);
			mTestView.startAnimation(mRotaAnim);
			rotateAngle = 0;
		}
		return retValue;
	}

	@Override
	public boolean onDown(MotionEvent e) {
		if (mTestView != null)
			mTestView.clearAnimation();
		return true;
	}

	@Override
	public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
			float velocityY) {
		return false;
	}

	@Override
	public void onLongPress(MotionEvent e) {
	}

	@Override
	public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,
			float distanceY) {
		rotateAngle = (e1.getY() - e2.getY()) / getHeight() * MAX_ROTATE_ANGLE;
		invalidate();
		return true;
	}

	@Override
	public void onShowPress(MotionEvent e) {	
	}

	@Override
	public boolean onSingleTapUp(MotionEvent e) {
		return false;
	}

	@Override
	public void onFlip() {
		mTestView.setBackgroundColor(COLORS[(++mCurrentColor) % COLORS.length]);
	}
	private static int mCurrentColor = 0;
	private static final int[] COLORS = new int[] {Color.BLUE, Color.RED};
}
 

使用代码:

package com.ray.demo;

import com.ray.animation.TestViewGroup;

import android.app.Activity;
import android.os.Bundle;

public class ChromeEggActivity extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(new TestViewGroup(this));
    }
}
 
分享到:
评论
1 楼 大大大江 2013-06-14  
   Thanks 。

相关推荐

    类似新浪微博js图片旋转/翻转效果

    类似新浪微博js图片旋转/翻转效果 兼容ie6,ie7,ie8,firefox,opera,chrome...; html5,canvas应用; 新浪微博里的图片旋转效果!弥补了新浪里在ie8下旋转图片时不会撑开容器,导致有时候图片看不到全部的问题。由于...

    css3实现3D色子翻转特效

    为了实现翻转效果,使用`transform`属性中的`rotateY`或者`rotateX`函数,这允许我们绕着Y轴或X轴旋转元素。例如,可以设置`.page`类在不同时间点的`rotateY`值,当它们在时间线上顺序被激活时,就会产生色子翻转的...

    jquery-flip:类似于Flipboard的效果,适用于jquery和jquery mobile

    翻转效果当前可在WebKit浏览器(例如Chrome,Safari,包括iOS移动Safari)或Firefox 11上使用。它仍可与其他浏览器一起使用,但将优先选择“幻灯片”效果。 兼容性 当前版本与jQuery 1.6.4、1.7.X,1.8.X和jQuery ...

    4中图片PPT效果切换特效

    对于兼容性问题,描述中提到了支持的浏览器列表,包括IE8及更新版本,以及360、Firefox、Chrome、Safari、Opera、傲游、搜狗和世界之窗。这意味着这个JavaScript特效已经考虑了不同浏览器的差异,可能使用了一些跨...

    HTML5电子杂志翻书动画特效.zip

    通过JavaScript,特别是针对“JS特效-翻牌页角”的标签,我们可以推测这个特效是通过模拟真实的纸质书页翻转效果来增强用户体验,让读者在数字环境中也能感受到类似阅读实体书籍的感官刺激。 实现这种翻页特效的...

    CSS3+JavaScript实现翻页幻灯片效果

    翻页幻灯片效果是一种常见的网页展示效果,通过翻动模拟真实世界的纸张翻转效果,给用户以视觉上的冲击和吸引。在本知识点中,我们将详细探讨如何使用CSS3和JavaScript技术来实现这样的效果,并通过具体的代码实现来...

    愚人节巧用CSS开个极客式玩笑以chrome为例

    `,使图片的内容翻转180度,形成上下颠倒的效果。 4. **图片自转**: 要让图片自身旋转,同样可以利用`-webkit-animation`,但这次是设置为图片元素。如`-webkit-animation: spin 1s linear infinite;`会让图片每...

    CSS3设计动画综合实战6.pdf

    6. **CSS3盒模型和兼容性处理**:`display: inline-block`和`zoom: 1`以及`*display: inline`组合使用,是为了在IE7及以下版本中实现类似`display: inline-block`的效果,确保元素能水平排列并保持块级元素特性。...

    绝对令人的惊叹的CSS3折叠效果(3D效果)整理

    Oridomi是一个独立的JavaScript插件,专门用于生成类似纸张的折叠效果。它不依赖任何其他JavaScript框架,但对于jQuery提供了可选的支持。Oridomi利用CSS3的3D变换功能,使得元素可以沿着预定的路径折叠和展开,为...

    js图片查看器(可缩放、旋转、翻转)特效代码

    3. **CSS3变换**:为了实现图片的旋转和翻转效果,JavaScript可能会结合CSS3的`transform`属性。`transform`允许开发者对元素进行二维或三维变换,如`rotate()`(旋转)、`scale()`(缩放)和`flip`(翻转)。 4. *...

    移动web的滑动切换demo

    另一方面,flipsnap是一个专为移动设备设计的页面切换库,它利用iscroll的滚动功能,实现了类似翻书或卡片翻转的效果。flipsnap的主要优点在于它能够轻松地创建一个可滑动的网格布局,当用户在屏幕上滑动时,内容会...

    项目介绍1

    - 引导页实现了多种切换页面的方式,尽管未完全实现原3D翻转效果和动画同步,但仍提供了良好的页面导航。 - 魅力图书馆页中,有轮播图、全选/取消全选功能、选项卡自动切换等,增加了用户的互动性。 - 在服务页,...

    flip-crx插件

    这个插件的独特之处在于它能将用户访问的任何网页上的图像进行水平翻转,从而创造出一种有趣的效果,比如让网页上的所有人物像是在照镜子一样。这种功能在与朋友或同事分享时尤其能引发笑声,因为当他们浏览安装了该...

    CSS3实现的3D透视特效特效代码

    不过,现代主流浏览器(如Chrome、Firefox、Safari、Edge等)都已经很好地支持了CSS3的3D透视效果。在实际应用中,应使用前缀(如 `-webkit-`)来确保在某些浏览器中的兼容性,并通过检测浏览器特性来提供适当的回退...

    feature flipping-crx插件

    7. **跨平台兼容**:虽然这里讨论的是Chrome浏览器的插件,但特征切换的概念可以应用于任何支持类似机制的软件,包括桌面应用、移动应用乃至服务器端应用。 8. **API设计**:为了实现特征翻转,需要设计一个清晰且...

    新浪网五屏Flash+js左右翻牌广告代码

    在这个案例中,JavaScript可能被用来控制广告翻牌的效果,如左右切换、定时自动播放、用户点击触发翻转等互动功能。 3. 网页广告设计:设计出引人注目的广告对于提升品牌知名度和网站流量至关重要。左右翻牌的广告...

    24款漂亮实用的Web 2.0风格CSS翻页

    1. **动态效果**:Web 2.0设计注重用户体验,CSS翻页通过流畅的动画效果,如平滑过渡、淡入淡出、3D翻转等,使用户在浏览页面时感到更加舒适自然。 2. **响应式设计**:这些CSS翻页方案通常都考虑到了不同设备的...

    js图片插件viewer

    viewer.js 是一个功能强大的JavaScript图片查看器插件,它以其简洁的API、丰富的自定义选项以及优雅的动画效果深受开发者喜爱。此插件允许用户在网页上轻松实现类似画廊的图片浏览体验,且支持多种交互功能,如放大...

Global site tag (gtag.js) - Google Analytics