`

View摆动效果

 
阅读更多
先看下效果:
[img]

[/img]
[img]

[/img]
[img]

[/img]
[img]

[/img]

工程结构图:
[img]

[/img]

主类:
package com.amaker.list;

import android.app.Activity;
import android.graphics.Camera;
import android.graphics.Matrix;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.animation.AccelerateDecelerateInterpolator;
import android.view.animation.AccelerateInterpolator;
import android.view.animation.Animation;
import android.view.animation.AnticipateInterpolator;
import android.view.animation.AnticipateOvershootInterpolator;
import android.view.animation.BounceInterpolator;
import android.view.animation.CycleInterpolator;
import android.view.animation.DecelerateInterpolator;
import android.view.animation.LinearInterpolator;
import android.view.animation.OvershootInterpolator;
import android.view.animation.Transformation;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;

/**
 * @Title: ListViewAnimationDemoActivity.java
 * @Package com.xiaoma.listviewanimation.demo
 * @Description: ListView控件动画学习测试
 * @author MZH
 * 
 * 
 */
public class ListViewAnimationDemoActivity extends Activity implements
		OnClickListener {

	private ListView listview;
	private Button btn;

	/** Called when the activity is first created. */
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		init();
	}

	/**
	 * 初始化方法实现
	 */
	private void init() {
		btn = (Button) findViewById(R.id.button);
		btn.setOnClickListener(this);
		String items[] = { "还记得", "那一年", "那一天", "有个人", "爱过我",
				"洗刷刷", "爱拉拉", "哇吼吼", "咔酷伊", "咔哇伊", "哦吼吼", "小马果"};
		listview = (ListView) findViewById(R.id.listview);
		//适配器我就用最简单的,要用复杂的,大家可以自定义适配器
		ArrayAdapter<String> adapter = new ArrayAdapter<String>(
				getApplicationContext(), android.R.layout.simple_list_item_1,
				items);
		listview.setAdapter(adapter);
	}

	/**
	 * 布局内所有点击事件监听
	 */
	public void onClick(View v) {
		// 因为只有一个按钮,小x就直接写个if简单的判断下了,多个老规矩用分支判断
		if (v.getId() == R.id.button) {
			//开始播放ListView动画
			startPlayAnimation();
		}
	}

	/**
	 * 开始播放ListView动画方法实现
	 */
	private void startPlayAnimation() {
		// ListViewAnimationChange为矩阵控制类
		listview.startAnimation(new ListViewAnimationChange());
	}

	/**
	 * @Title: ListViewAnimationChange.java
	 * @Package com.xiaoma.listviewanimation.demo
	 * @Description: ListView控件的矩阵内部控制类
	 * @author MZH
	 * 在这个地方讲下,要自行控制屏幕矩阵的话必须实现现在两个方法
	 */
	private class ListViewAnimationChange extends Animation {

		@Override
		public void initialize(int width, int height, int parentWidth,
				int parentHeight) {

			// 将动画播放时间设置为5秒
			setDuration(5000);
			// 设置缩放完成后,效果不消失
			setFillAfter(true);

			// 设置线性插值器,这个地方new出来的对象跟在scale.xml中的插值器没什么区别,也可以用别的
			
			/**
			 * 顺带着讲下在2D动画中常用的插值器吧,小x先给自己及大伙提醒下:插值器,就是告诉Android,播放动画时
			 * 是从快到慢还是从慢到快,从左到右的旋转还是其它的方式的动画,刚开始很怕这个词,试了下效果,其实不太吓人...
			 * 吼吼,类型如下面的八种,跟scale.xml或alpha.xml中使用的插值器一样的,只是写的形式不一样而已
			 * 
			 */

			/**
			 * 所有的插值器都实现Interpolator接口中的 getInterpolation(float input)方法,好奇的朋友
			 * Ctrl跟进下....只注意一点,插值器不能同时set多个,不然最前面的会被覆盖,即:无效果..
			 * new AccelerateDecelerateInterpolator(); 
			 * new AccelerateInterpolator(); 
			 * new CycleInterpolator(1.0f); 
			 * new DecelerateInterpolator(); 
			 * new AnticipateInterpolator(); 
			 * new AnticipateOvershootInterpolator(); 
			 * new BounceInterpolator(); 
			 * new OvershootInterpolator(); 
			 * new LinearInterpolator();
			 * 与以上几种插值器相对应的方法在xml文件中的使用方式大家可以自动ALT+/试下,换汤不换药
			 */
			
			//下面是小x试的效果,好奇的朋友们可以打开效果试下,小x不一一解释
			// setInterpolator(new LinearInterpolator());
			// setInterpolator(new CycleInterpolator(1.0f) );
			// setInterpolator(new AccelerateDecelerateInterpolator());
			// setInterpolator(new DecelerateInterpolator());
			
			
			/**
			 * 这两个好玩就选了,这个效果类似于Android 4.0的那个左右摆动..效果可以自己打开注释试下..
			 * 要用自己效果的可以重新改下矩阵的控制
			 */
			setInterpolator(new AnticipateOvershootInterpolator()); 
			//setInterpolator(new OvershootInterpolator()); 
			super.initialize(width, height, parentWidth, parentHeight);
		}
		
		/**
		 * 这个重写是控制矩阵中关键的一步
		 * 介绍一个参数:interpolatedTime 安卓系统在模拟动画时会反复的调用这个方法
		 * 所以这个值是一直变化的,从0-1变化....
		 * 这个方法就是在某一个时间点上将动画添加到指定的控件上
		 */
		@Override
		protected void applyTransformation(float interpolatedTime,
				Transformation t) {
			super.applyTransformation(interpolatedTime, t);

			/*
			 * final Matrix matrix = t.getMatrix();
			 * matrix.setScale(interpolatedTime, interpolatedTime);
			 * matrix.preTranslate(-50f, -50f); matrix.postTranslate(50f, 50f);
			 */
			// matrix.setRotate(45f);
			// matrix.setTranslate(40f,50f);
			
			/**
			 * Camera小x犯的错:导相机包...大家注意下就可以了,
			 * 我们应该导入graphics包
			 */
			Camera camera = new Camera();
			//取得屏幕矩阵对象
			final Matrix matrix = t.getMatrix();
			camera.save();
			/**
			 * 下面方法中的参数大家自己CTRL跟下,小x不一一解说,
			 * 不跟进的自己改改看下效果就知道是什么意思了..
			 */
			camera.translate(0.0f, 0.0f, (1300 - 1300.0f * interpolatedTime));
			camera.rotateY(360 * interpolatedTime);
			camera.getMatrix(matrix);
			//设置矩阵播放动画前的位置.原点为:0,0
			matrix.preTranslate(-50f, -50f);
			//设置矩阵播放完动画后的位置
			matrix.postTranslate(50f, 50f);
			camera.restore();
			// 如果用了以下的效果,则上面Camera做的矩阵变换将被覆盖
			// matrix.setScale(interpolatedTime, interpolatedTime);
		}
	}
}


alpha
<?xml version="1.0" encoding="utf-8"?>
<!-- alpha 
	这个地方说几句,android:interpolator 大家自行换换别的试下
-->
<alpha xmlns:android="http://schemas.android.com/apk/res/android" 
    android:interpolator="@android:anim/bounce_interpolator"
    android:fromAlpha="0.0"
    android:toAlpha="1.0"
    android:duration="1000"
    />


list_layout_controller.xml
<?xml version="1.0" encoding="utf-8"?>
<!-- 动画控制器,这个文件只是把要添加的动画与我们的动画资源关联起来
	 下面这个属性来控制控制动画的方向,如:比底部到顶部,或别的...
	 我们在主布局文件中控件的属性里面使用这个地方的动画控制器
	 android:animationOrder="reverse"
 -->
<layoutAnimation xmlns:android="http://schemas.android.com/apk/res/android"
    android:delay="30%"
    android:animationOrder="reverse"
    android:animation="@anim/scale"
    />


scale
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
     android:interpolator="@android:anim/accelerate_interpolator">
    <scale 
        android:fromXScale="1"
        android:toXScale="1"
        android:fromYScale="0.1"
        android:toYScale="1.0"
        android:duration="500"
        android:pivotX="50%"
        android:pivotY="50%"
        />

</set>


translate_scale.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    
    <alpha 
        android:fromAlpha="0.0"
        android:toAlpha="1.0"
        />
    <translate 
        android:fromYDelta="-100%"
        android:toYDelta="0%"
        />
    
</set>


main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >
    
    <Button 
        android:id="@+id/button"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="播放ListView动画"
        />
	<ListView
	    android:id="@+id/listview"
	    android:layout_width="fill_parent"
	    android:layout_height="fill_parent"
	    android:layoutAnimation="@anim/list_layout_controller"
	    android:persistentDrawingCache="animation|scrolling" />
</LinearLayout>


配置文件:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.amaker.list"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk android:minSdkVersion="8" />
    <application
        android:icon="@drawable/icon"
        android:label="@string/app_name" >
        <activity
            android:name=".ListViewAnimationDemoActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest>

  • 大小: 25.1 KB
  • 大小: 25.2 KB
  • 大小: 17.2 KB
  • 大小: 28.2 KB
  • 大小: 32.9 KB
分享到:
评论

相关推荐

    安卓动画效果相关-这是一个天平效果的自定义控件实现了天平的摆动动画.rar

    这个压缩包文件“安卓动画效果相关-这是一个天平效果的自定义控件实现了天平的摆动动画.rar”显然是一个专门针对Android平台的自定义控件项目,其核心在于实现一个模拟天平摆动的动画效果。下面将详细探讨相关的知识...

    微信小程序图片左右摆动效果详解

    本文将详细介绍如何在微信小程序中实现图片左右摆动的动画效果。需要注意的是,小程序的动画实现与传统的CSS3动画有所不同,微信小程序主要通过JavaScript来控制动画,而非传统的CSS。 首先,需要了解微信小程序的...

    安卓图片旋转,摆动动效

    在Android开发中,图片旋转和摆动动效是常见的用户界面增强技巧,可以提升应用的交互体验。本文将深入探讨如何使用`android.graphics.Matrix`类和Java代码在Android平台上实现这些效果。 首先,`android.graphics....

    自定义View_灵动的锦鲤

    在Android开发中,自定义View是一项重要的技能,它允许开发者根据需求创建独特的用户界面元素,以实现更加丰富和个性化的视觉效果。"自定义View_灵动的锦鲤"这个项目可能是一个示例,展示了如何利用Android SDK来...

    Delphi中时钟的应用,实现文字的上下摆动和滚动

    在Delphi编程环境中,我们可以利用其强大的图形用户界面(GUI)设计能力,结合时钟组件,来实现一些动态效果,如文字的上下摆动和滚动。这个主题涉及到多个知识点,包括Delphi的基础语法、组件使用、事件处理以及...

    android高仿墨迹天气背景动画效果-云,风,雪等效果源码.zip

    风的效果可能通过改变其他元素(如树叶、草丛等)的摆动程度来间接体现。这同样可以通过自定义View,根据风力的强弱改变元素的角度和幅度,再配合动画框架进行平滑的动画过渡。 至于雪花飘落的动画,可以使用粒子...

    Android自定义View实现钟摆效果进度条PendulumView

    在这个案例中,我们将探讨如何实现一个名为PendulumView的自定义View,它展示了一个钟摆效果的进度条。这个View适用于为加载界面提供一种视觉上的反馈,其动画效果使得加载过程更有趣。 首先,我们从自定义属性开始...

    android 风车效果

    6. **组合动画**:为了模拟风车的真实效果,可能需要组合多个动画,比如同时旋转不同叶片,或者在特定条件下添加其他附加动画,如叶片的摆动。 7. **测试与调整**:最后,进行充分的设备适配和性能测试,根据实际...

    这是一个天平效果的控件

    摆动动画可能涉及到角度变化、位移以及速度控制等参数,以达到逼真的视觉效果。 自定义控件通常需要继承自Android的基础View或者 ViewGroup,并覆盖其onDraw()方法来绘制自定义的UI。对于天平效果,开发者可能需要...

    高仿墨迹天气背景动画效果-云,风,雪等

    风的效果可能通过改变其他元素(如树叶、物体等)的摆动状态来表现。可以为这些元素设置旋转或位移动画,并根据风力大小调整动画的强度和速度。 雪的动画则需要创建大量的雪花对象,每个都有不同的飘落路径。可以...

    Android代码-风车效果源码.zip

    风车效果可能使用了这些API之一,通过改变视图的旋转角度、透明度或大小等属性,来模拟风车的转动和摆动。 2. **自定义View**:为了创建独特的视觉效果,如风车转动,开发者可能创建了一个自定义的`View`类。在这个...

    Android自定义Animation实现View摇摆效果

    这种效果通常用于模拟物体的自然运动,比如风中的树叶或者钟表指针的摆动,增加应用的动态感。 首先,我们需要在布局文件`activity_main.xml`中设置基础结构。在这个例子中,我们使用了一个LinearLayout作为容器,...

    安卓动画效果相关-Loading摆锤动画的进度控件.rar

    对于摆锤动画,我们可能需要控制摆锤的角度随时间线性或非线性变化,从而实现摆动效果。 再者,自定义`View`是实现复杂动画的另一种方法。在`onDraw()`方法中,我们可以根据动画状态改变绘制的内容,如改变摆锤的...

    SmartKoi.zip

    在这个项目中,可能是通过改变锦鲤的位置、角度和速度来实现游动和摆动效果。 4. **触摸事件处理**:当用户点击屏幕时,项目会响应并产生水波纹扩散效果。这涉及到对`MotionEvent`的监听和处理,例如在`...

    Android程序研发源码Android 真实书籍翻页效果.zip

    这可以通过添加额外的动画效果来实现,例如,页面在接近翻转结束时减速,或者当用户松手后页面会自然摆动几下。 6. **性能优化**:由于翻页动画涉及到大量的视图操作和计算,因此性能优化至关重要。可以通过使用...

    android程序 实现personwalk动画效果

    首先,Android提供了多种动画机制,包括属性动画(Property Animation)、视图动画(View Animation)以及Transition API。对于personwalk动画,我们可能会使用属性动画,因为它提供了更多的控制和灵活性,可以改变...

    AnimationImage:使一张图片围绕一个固定的点左右摆动

    在本例中,我们将改变图片视图`UIImageView`的`center`属性来实现摆动效果。中心点是我们指定的固定点,图片将围绕这个点摆动。为了使图片左右摆动,我们需要在每次动画执行时改变图片的X坐标,而保持Y坐标不变。 ...

    安卓动画效果相关-Android的秋千摇摆动画代码例子用于演示钟摆秋千晃荡等左右摇摆的动画效果.rar

    3. **旋转(Rotation)**:为了实现摆动效果,我们需要让视图围绕一个轴线旋转。这可以通过`ObjectAnimator.ofFloat(view, "rotation", startAngle, endAngle)`来实现,其中startAngle和endAngle定义了旋转的起始和...

Global site tag (gtag.js) - Google Analytics