`

android 控件翻转切换布局

阅读更多



过程是:
1:准备好布局如下:
2:翻转view动画,翻转动画的监听。
3:翻转后布局的替换,这里用了隐藏
我用了setVisibility(View.INVISIBLE)



layout/mygaller_item_bg_01是正面
layout/mygaller_item_bg_02是反面




布局1:mygaller_item.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
	android:layout_width="fill_parent" android:orientation="vertical"
	android:layout_height="wrap_content" android:padding="25dip"
	android:id="@+id/container">
	<FrameLayout android:layout_width="fill_parent"
		android:orientation="vertical" android:layout_height="wrap_content"
		android:id="@+id/container_bg">
		<include layout="@layout/mygaller_item_bg_01" />
		<include layout="@layout/mygaller_item_bg_02" />
	</FrameLayout>
</LinearLayout> 








View翻转效果:来源:http://mobile.51cto.com/android-265495.htm
import android.graphics.Camera;
import android.graphics.Matrix;
import android.view.animation.Animation;
import android.view.animation.Transformation;

public class Rotate3d extends Animation {
	private final float mFromDegrees;
	private final float mToDegrees;
	private final float mCenterX;
	private final float mCenterY;
	private final float mDepthZ;
	private final boolean mReverse;
	private Camera mCamera;

	public Rotate3d(float fromDegrees, float toDegrees, float centerX,
			float centerY, float depthZ, boolean reverse) {
		mFromDegrees = fromDegrees;
		mToDegrees = toDegrees;
		mCenterX = centerX;
		mCenterY = centerY;
		mDepthZ = depthZ;
		mReverse = reverse;
	}

	@Override
	public void initialize(int width, int height, int parentWidth,
			int parentHeight) {
		super.initialize(width, height, parentWidth, parentHeight);
		mCamera = new Camera();
	}

	@Override
	protected void applyTransformation(float interpolatedTime, Transformation t) {
		final float fromDegrees = mFromDegrees;
		float degrees = fromDegrees
				+ ((mToDegrees - fromDegrees) * interpolatedTime);
		final float centerX = mCenterX;
		final float centerY = mCenterY;
		final Camera camera = mCamera;
		final Matrix matrix = t.getMatrix();
		camera.save();
		if (mReverse) {
			camera.translate(0.0f, 0.0f, mDepthZ * interpolatedTime);
		} else {
			camera.translate(0.0f, 0.0f, mDepthZ * (1.0f - interpolatedTime));
		}
		camera.rotateY(degrees);
		camera.getMatrix(matrix);
		camera.restore();
		matrix.preTranslate(-centerX, -centerY);
		matrix.postTranslate(centerX, centerY);
	}
}



过程和动画翻转的控制

public class ViewRotate implements OnClickListener {
	private ImageView imageview;
	private View bg;
	private DisplayNextView displayNextView;
	private Context context;
	private View convertView;
	private LayoutInflater mInflater;
	private boolean now_zhengfan;
	private View container_bg;

	public ViewRotate(Context context, View convertView,
			LayoutInflater mInflater) {
		this.context = context;
		this.convertView = convertView;
		this.mInflater = mInflater;
		now_zhengfan = true;
		AnimationUtils.loadAnimation(context, R.anim.my_alpha_action);
		init();
	}

	public void init() {

		
		bg = (ViewGroup) convertView.findViewById(R.id.container);
		bg.findViewById(R.id.btn_more).setOnClickListener(this);
		container_bg = convertView.findViewById(R.id.container_bg);

		container_bg
		.setBackgroundDrawable(GraphicsBitmapUtils.
				BitmapToDrawable(GraphicsBitmapUtils.getRoundedCornerBitmap(GraphicsBitmapUtils
				.drawableToBitmap(context.getResources()
						.getDrawable(R.drawable.zh)))));
	}

	private void applyRotation(int position, float start, float end) {
		// Find the center of the container
		final float centerX = bg.getWidth() / 2.0f;
		final float centerY = bg.getHeight() / 2.0f;
		final Rotate3d rotation = new Rotate3d(start, end, centerX, centerY,
				310.0f, false);
		rotation.setDuration(500);
		rotation.setFillAfter(false);
		rotation.setInterpolator(new AccelerateInterpolator());
		rotation.setAnimationListener(new DisplayNextView(position, true));
		bg.startAnimation(rotation);
		

AlphaAnimation alphaAnim = new AlphaAnimation(0, 1);
	}

	@Override
	public void onClick(View v) {
		// TODO Auto-generated method stub
		bg.setEnabled(false);
		applyRotation(0, 0, 90);
	}

	private final class DisplayNextView implements Animation.AnimationListener {
		private final int mPosition;
		private final boolean b;

		private DisplayNextView(int position, boolean t) {
			mPosition = position;
			b = t;
		}

		public void onAnimationStart(Animation animation) {
		}

		public void onAnimationEnd(Animation animation) {
			if (b) {
				bg.post(new SwapViews(mPosition));
				if (now_zhengfan) {
					bg.findViewById(R.id.backe_bg1).setVisibility(
							View.INVISIBLE);
				} else {
					bg.findViewById(R.id.backe_bg2).setVisibility(
							View.INVISIBLE);
				}
			} else {

				bg.setEnabled(true);
				if (now_zhengfan) {
					bg.findViewById(R.id.backe_bg2).setVisibility(View.VISIBLE);
					bg.setOnClickListener(ViewRotate.this);
					bg.setClickable(true);

					AlphaAnimation alphaAnim = new AlphaAnimation(0, 1);
					alphaAnim.setDuration(2000);
					alphaAnim.setStartOffset(500);
					alphaAnim
							.setAnimationListener(new CanClickAnimationListener(
									bg));
					bg.findViewById(R.id.backe_bg2).startAnimation(alphaAnim);
					now_zhengfan = false;
				} else {
					bg.findViewById(R.id.backe_bg1).setVisibility(View.VISIBLE);
					bg.setOnClickListener(ViewRotate.this);

					now_zhengfan = true;
					bg.setClickable(false);
					View btn = bg.findViewById(R.id.btn_more);
					btn.setOnClickListener(ViewRotate.this);

//					container_bg
//							.setBackgroundDrawable(GraphicsBitmapUtils.BitmapToDrawable(GraphicsBitmapUtils.getRoundedCornerBitmap(GraphicsBitmapUtils
//									.drawableToBitmap(context.getResources()
//											.getDrawable(R.drawable.zh)))));

					AlphaAnimation alphaAnim = new AlphaAnimation(0, 1);
					alphaAnim.setDuration(2000);
					alphaAnim.setStartOffset(500);
					alphaAnim
							.setAnimationListener(new CanClickAnimationListener(
									bg, btn));

					bg.findViewById(R.id.backe_bg1).startAnimation(alphaAnim);
					// bg.findViewById(R.id.backe_bg1).startAnimation(
					// CopyOfTestRotate.this.animation);

				}
			}

		}

		public void onAnimationRepeat(Animation animation) {

		}
	}

	private final class SwapViews implements Runnable {
		private final int mPosition;

		public SwapViews(int position) {
			mPosition = position;
		}

		public void run() {
			final float centerX = bg.getWidth() / 2.0f;
			final float centerY = bg.getHeight() / 2.0f;
			Rotate3d rotation;
			if (mPosition > -1) {

				rotation = new Rotate3d(90, 180, centerX, centerY, 310.0f,
						false);
				rotation.setAnimationListener(new DisplayNextView(mPosition,
						false));
			} else {
				rotation = new Rotate3d(90, 0, centerX, centerY, 310.0f, false);
			}
			rotation.setDuration(500);
			rotation.setFillAfter(false);
			rotation.setInterpolator(new DecelerateInterpolator());
			bg.startAnimation(rotation);
			bg.setEnabled(false);
		}
	}

}
分享到:
评论
1 楼 离艮巽 2014-06-23  
谢谢,刚好有用到

相关推荐

    android 控件翻转切换布局(转)

    总结来说,实现Android控件翻转切换布局涉及到视图切换组件、属性动画以及自定义动画的使用。开发者需要对Android动画系统有深入的理解,并能灵活运用相关API来创造出独特且流畅的用户体验。结合提供的博客文章和...

    Android点击翻转控件.zip

    5. UI布局:分析截图,理解如何将翻转控件融入到整体应用的UI设计中。 通过这个项目,开发者不仅能学习到Android自定义视图和动画的相关知识,还能提高在实际项目中应用这些技术的能力。对于希望提升Android开发...

    Android3D翻页效果的倒计时控件

    总之,创建一个Android3D翻页效果的倒计时控件是一项涉及多方面技术的任务,包括倒计时逻辑、视图切换、3D动画以及UI设计。熟练掌握这些技能对于提升Android应用的用户体验至关重要。通过不断学习和实践,开发者可以...

    翻转吧控件

    总之,"翻转吧控件"展示了如何利用Android的属性动画实现控件翻转效果。通过深入理解并实践这一技术,开发者可以在自己的项目中灵活地创建各种复杂的动画效果,提升应用的视觉表现力和用户体验。

    Android 翻转手机即换静音或震动

    【Android 翻转手机即换静音或震动】是一个基于Android平台的应用程序,它允许用户通过简单地翻转他们的设备来切换手机的铃声模式,例如从响铃切换到振动或者静音模式。这个应用可能包含以下核心知识点: 1. **...

    【eoe+Android特刊】第十九期:Android自定义控件.pdf

    #### 一、Android控件基本介绍 Android平台提供了丰富的控件库,这些控件可以满足大多数应用界面设计的需求。然而,在某些情况下,开发人员可能需要创建自己的自定义控件以实现特定的功能或达到特定的设计效果。...

    android activity 切换效果库(劲推荐)

    在布局XML文件中,添加ViewFlow控件,并为其指定相应的子View: ```xml android:id="@+id/view_flow" android:layout_width="match_parent" android:layout_height="match_parent" /&gt; ``` 然后,在对应的...

    Android高级图片滚动控件,3D版的图片轮播器Demo

    在Android中,`ViewPager`是一个常见的滑动页面容器,但默认情况下不支持3D翻转效果。因此,我们需要创建一个新的`PagerAdapter`子类,并重写`instantiateItem()`和`destroyItem()`方法来管理图片视图。同时,我们...

    Android实现卡片翻转动画

    总结来说,Android中的卡片翻转动画可以通过组合布局、视图操作和`ObjectAnimator`实现。通过精心设计布局和动画参数,可以创造出富有交互性的用户体验。同时,理解并掌握Android动画机制对于提升应用的视觉效果和...

    android,Gallery,页面翻转

    在Android开发中,`Gallery`组件是一个非常有用的控件,它允许用户通过水平滚动来浏览一系列的项目,常用于创建照片画廊或者选择菜单。在本案例中,我们关注的是如何为`Gallery`添加页面翻转的效果,以增强用户体验...

    Android-单页显示3个Item的ViewPager炫酷切换效果适用于Banner等。

    在Android开发中,ViewPager是一个非常常用的控件,它允许用户左右滑动来浏览多个页面,通常用于实现类似轮播图(Banner)、Tab切换等效果。本项目“Android-单页显示3个Item的ViewPager炫酷切换效果”是针对这种...

    android 防微信图片放大,仿win8界面图片动态翻转。

    此外,项目的源码中可能包含了一些自定义控件和布局,用于构建与Win8风格相匹配的界面元素。例如,可能有一个自定义的ImageView,它不仅具备放大功能,还集成了翻转效果。同时,布局文件可能使用了RelativeLayout或...

    Android自定义控件之翻转按钮的示例代码

    总结来说,创建Android自定义翻转按钮涉及到了XML布局设计、自定义View的构造和生命周期方法,以及使用Android的动画系统实现动态效果。通过理解这些基本原理,开发者可以灵活地创建各种复杂的自定义控件,提升应用...

    Android高级图片滚动控件,3D版的图片轮播器Demo.zip

    - 3D转换:这个控件利用Android的OpenGL ES库实现了3D翻转效果,使得图片在切换时有立体感,增强了用户体验。 - 自定义动画:开发者可以根据需求定制不同的3D转换动画,比如旋转、平移等,使轮播更加吸引眼球。 2...

    Android ViewFlipper翻转视图使用详解

    Android ViewFlipper 翻转视图使用详解 Android ViewFlipper 是 Android 系统自带的一个多页面管理控件,可以自动播放。它和 ViewPager 有所不同,ViewPager 继承自 ViewGroup,是一页一页的,可以带动画效果,可以...

    Android应用源码之Android高级图片滚动控件,3D版的图片轮播器Demo.zip

    3D图片轮播器通常通过矩阵变换实现图片的翻转效果,使得图片在切换时有类似翻书页的动态感觉。在Android中,这需要对OpenGL ES或者Canvas的绘图操作有深入的理解,涉及到矩阵运算、纹理映射以及视图转换等概念。...

    DraggableFlipView 滑动切换图片立体翻转效果

    当用户在屏幕上滑动时,DraggableFlipView会根据手势的方向进行图片的翻转切换。 2. **立体翻转效果**: 这种效果是通过视图的3D变换实现的,Android的`android.view.animation`包提供了许多动画API,如` ...

    Android应用源码模拟立体翻转效果,非Gallery实现-IT计算机-毕业设计.zip

    为了实现非Gallery的翻转效果,开发者可能创建了自己的滚动视图或使用了自定义布局来承载需要翻转的内容。这可能涉及到自定义控件的开发,通过重写`onTouchEvent`事件来处理用户的滑动操作,判断滑动方向以触发相应...

Global site tag (gtag.js) - Google Analytics