Android开发之旅一简单的Animator动画使用

对于Path的菜单效果看着很不错,今天就使用动画做个没有幅度的试试?

练练手重写RelativeLayout


看主布局

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    >
 <com.example.testpath.TestLayout 
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/layout"
 ></com.example.testpath.TestLayout> 

</RelativeLayout>

MainActivity

package com.example.testpath;

import java.util.ArrayList;
import java.util.List;

import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;


public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        
      TestLayout layout=(TestLayout) findViewById(R.id.layout);
      
      List<Integer> imgRes=new ArrayList<Integer>();
      imgRes.add(R.drawable.composer_music);
      imgRes.add(R.drawable.composer_music);
      imgRes.add(R.drawable.composer_music);
      imgRes.add(R.drawable.composer_music);
      imgRes.add(R.drawable.composer_music);
      
      
      layout.init(R.drawable.composer_music, imgRes, TestLayout.LEFT_BOTTOM);
      
      layout.setOnPKButClickListener(new OnClickListener() {
		
		@Override
		public void onClick(View v) {
			// TODO Auto-generated method stub
		 System.out.println("----getId-----"+v.getId());
		}
	});
      
   /*   layout.setOnTouchListener(new OnTouchListener() {
		
		@Override
		public boolean onTouch(View view, MotionEvent event) {
			// TODO Auto-generated method stub
			
			switch (event.getAction()) {
			case MotionEvent.ACTION_DOWN:
				System.out.println("----dd------");
				return false;

			case MotionEvent.ACTION_MOVE:
				System.out.println("----mm------");
				return false;
				
			case MotionEvent.ACTION_UP:
				System.out.println("----uu------");
				return false;
			}
			
			return false;
		}
	});*/
    }


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();
        if (id == R.id.action_settings) {
            return true;
        }
        return super.onOptionsItemSelected(item);
    }
}


重写的layout

package com.example.testpath;

import java.util.ArrayList;
import java.util.List;

import android.animation.Animator;
import android.animation.Animator.AnimatorListener;
import android.animation.AnimatorSet;
import android.animation.ObjectAnimator;
import android.content.Context;
import android.util.AttributeSet;
import android.view.View;
import android.view.animation.Animation;
import android.view.animation.Animation.AnimationListener;
import android.view.animation.AnimationUtils;
import android.view.animation.BounceInterpolator;
import android.widget.ImageView;
import android.widget.RelativeLayout;

public class TestLayout extends RelativeLayout{
	
	private Context mContext;
	public static int LEFT_BOTTOM=1,RIGHT_BOTTOM=2;
	
	private ImageView mainButton;// 主按鈕
	
	//存放有多少个子按钮
	private List<ImageView> listImg=new ArrayList<ImageView>();
	
	private boolean isShow=false;
	
	//子按钮点击动画
	private Animation childAnim;

	public TestLayout(Context context, AttributeSet attrs, int defStyle) {
		super(context, attrs, defStyle);
		// TODO Auto-generated constructor stub
		mContext=context;
	}

	public TestLayout(Context context, AttributeSet attrs) {
		super(context, attrs);
		// TODO Auto-generated constructor stub
		mContext=context;
	}

	public TestLayout(Context context) {
		super(context);
		// TODO Auto-generated constructor stub
		mContext=context;
	}

	
	/**
	 * 
	 * @param imgRes
	 * @param place
	 */
	public void init(int resMain,List<Integer> imgRes,int place){
		
		int align1 = 1,align2 = 2;
		
		if(place == LEFT_BOTTOM){
			
			align1 = ALIGN_PARENT_LEFT;
			align2 = ALIGN_PARENT_BOTTOM;
			
		}else if(place == RIGHT_BOTTOM){
			
			align1 = ALIGN_PARENT_RIGHT;
			align2 = ALIGN_PARENT_BOTTOM;
			
		}
		
		
		//子按钮layout
		RelativeLayout layout = new RelativeLayout(mContext);
		//childLayout设置参数
		LayoutParams rlps1 = new LayoutParams(LayoutParams.MATCH_PARENT,
				LayoutParams.MATCH_PARENT);
		rlps1.alignWithParent = true;
		layout.setLayoutParams(rlps1);
		
		listImg.clear();
		
		//创建子按钮
		for(int i=0;i<imgRes.size();i++){
			
			ImageView img = new ImageView(mContext);// 子按扭圖片
			LayoutParams rlps=new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
			rlps.alignWithParent = true;
			rlps.addRule(align1, RelativeLayout.TRUE);
			rlps.addRule(align2, RelativeLayout.TRUE);
			img.setLayoutParams(rlps);
			img.setImageResource(imgRes.get(i));
			img.setId(i);
			img.setVisibility(View.INVISIBLE); // 此处为INVISIBLE,view才会有宽度
			layout.addView(img);
			
			listImg.add(img);
		}
		
		
		
		// 主按扭
				mainButton = new ImageView(mContext);
				mainButton.setImageResource(resMain);
				LayoutParams crosslps = new LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT);
				crosslps.alignWithParent = true;
				crosslps.addRule(align1, RelativeLayout.TRUE);
				crosslps.addRule(align2, RelativeLayout.TRUE);
				mainButton.setLayoutParams(crosslps);
				layout.addView(mainButton);
				
				
				//把布局添加进去
				this.addView(layout);
				
				childAnim=AnimationUtils.loadAnimation(mContext, R.anim.pk_sdk_view_bar_item);
				childAnim.setAnimationListener(new AnimationListener() {
					
					@Override
					public void onAnimationStart(Animation arg0) {
						// TODO Auto-generated method stub
						
					}
					
					@Override
					public void onAnimationRepeat(Animation arg0) {
						// TODO Auto-generated method stub
						
					}
					
					@Override
					public void onAnimationEnd(Animation arg0) {
						// TODO Auto-generated method stub
						startAnimationsOut(500);
					}
				});
				
				mainButton.setOnClickListener(new OnClickListener() {
					
					@Override
					public void onClick(View view) {
						// TODO Auto-generated method stub
						if(true == isShow){
							isShow=false;
							startAnimationsOut(500);
						}else{
							isShow=true;
							startAnimationsIn(500);
						}
					}
				});
	}
	
	
	/**
	 * 子按钮展开动画
	 * @param duration
	 */
	public void startAnimationsIn(int duration) {
		
		int x=0,y=0;
		
		for(int i=0;i<listImg.size();i++){
			
			ImageView img=listImg.get(i);
			img.setVisibility(View.VISIBLE);
			
			x = 0;
			y +=img.getWidth();
			
			
			
			
			/*Animation a=new TranslateAnimation(0,  x, 0, y);
			a.setInterpolator(new BounceInterpolator());
			a.setDuration(duration);
			a.setFillAfter(true);
			img.startAnimation(a);*/
			
			 AnimatorSet set = new AnimatorSet() ;
			 set.setDuration(duration);
//			 set.setInterpolator(new BounceInterpolator());
			 
			 
			 Animator animX = ObjectAnimator.ofFloat(img, "translationX", 0,x);
			 Animator animY = ObjectAnimator.ofFloat(img, "translationY", 0,-y);
			
			 animX.setInterpolator(new BounceInterpolator());
			 animY.setInterpolator(new BounceInterpolator());
			 
			 List<Animator> l=new ArrayList<Animator>();
			 l.add(animX);
			 l.add(animY);
			 
			 set.playTogether(l);
			 set.start();
			
		}
		
		
	}
	
	/**
	 * 子按钮收缩动画
	 * @param duration
	 */
	public void startAnimationsOut(int duration) {
		
		int x=0,y=0;
		
		for(int i=0;i<listImg.size();i++){
			
			final ImageView img=listImg.get(i);
//			img.setVisibility(View.INVISIBLE);
			
			x = 0;
			y +=img.getWidth();
			
			
			/*Animation a=new TranslateAnimation(x, 0, y, 0);
			a.setDuration(duration);
			a.setFillAfter(true);
			img.startAnimation(a);*/
			
			 AnimatorSet set = new AnimatorSet() ;
			 set.setDuration(duration);
			 

			 Animator animX = ObjectAnimator.ofFloat(img, "translationX", x,0);
			 Animator animY = ObjectAnimator.ofFloat(img, "translationY", -y,0);
			
			 List<Animator> l=new ArrayList<Animator>();
			 l.add(animX);
			 l.add(animY);
			 
			 set.playTogether(l);
			 set.start();
			 
			 set.addListener(new AnimatorListener() {
				
				@Override
				public void onAnimationStart(Animator arg0) {
					// TODO Auto-generated method stub
					
				}
				
				@Override
				public void onAnimationRepeat(Animator arg0) {
					// TODO Auto-generated method stub
					
				}
				
				@Override
				public void onAnimationEnd(Animator arg0) {
					// TODO Auto-generated method stub
					img.setVisibility(View.INVISIBLE);
				}
				
				@Override
				public void onAnimationCancel(Animator arg0) {
					// TODO Auto-generated method stub
					
				}
			});
		}
		
		
	}
	
	
	/**
	 * 子按钮点击事件动画(会移动view)
	 * @param view
	 * @param duration
	 */
	public void startChildAnim(View view,int duration){
		AnimatorSet set = new AnimatorSet() ;             
        Animator scaleX = ObjectAnimator .ofFloat(view, "scaleX", 2f); 
        Animator scaleY = ObjectAnimator .ofFloat(view, "scaleY", 2f); 
        Animator alpha = ObjectAnimator.ofFloat(view, "alpha", 1f, 0.2f); 
        
        List<Animator> l=new ArrayList<Animator>();
        l.add(scaleX);
        l.add(scaleY);
        l.add(alpha);
        
        set.setDuration(duration);
        set.playTogether(l);
        set.start();
        
        set.addListener(new AnimatorListener() {
			
			@Override
			public void onAnimationStart(Animator arg0) {
				// TODO Auto-generated method stub
				
			}
			
			@Override
			public void onAnimationRepeat(Animator arg0) {
				// TODO Auto-generated method stub
				
			}
			
			@Override
			public void onAnimationEnd(Animator arg0) {
				// TODO Auto-generated method stub
				
				startAnimationsOut(500);
			}
			
			@Override
			public void onAnimationCancel(Animator arg0) {
				// TODO Auto-generated method stub
				
			}
		});
	}
	
	/**
	 * 设置子按钮click事件
	 */
	public void setOnPKButClickListener(final OnClickListener l) {

		if (listImg != null && listImg.size() > 0) {
		
			for (int i = 0; i < listImg.size(); i++) {
				if (listImg.get(i) != null){
					
					listImg.get(i).setOnClickListener(new OnClickListener() {
						
						@Override
						public void onClick(View v) {
							// TODO Auto-generated method stub
							
							System.out.println("------点击了------");
//							startChildAnim(v, 500);
							v.startAnimation(childAnim);
							l.onClick(v);
						}
					});
				}
			}
		}
	}
	
}


看看效果

     



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值