画布的用法和fragment用法

时间:2023-01-30 20:55:16

画布CanvasAndroid框架API提供了一组2D描画API,使用这些API能够在一个画布(canvas)上渲染自己的定制图形,也能够修改那些既存的View对象,来定制它们的外观和视觉效果。在绘制2D图形时,通常要使用 把图形直接绘制在一个画布对象上(Canvas对象)。这种方法,要亲自调用相应类的onDraw()方法(把图形传递给Canvas对象),或者调用Canvas对象的一个draw…()方法(如drawPicture())。在这个过程中,还可以控制任何动画。

下面介绍下画布Canvas的用法:Canvas的英语意思就是帆布、画布的意思。顾名思义根据该类可以创建一个基本的画布,除了在画布上绘制之外,还需要设置一些关于画布的属性,比如,画布的颜色、尺寸等。画布设定好之后,还要参加一个画笔类再画布上创作:Paint paint = new Paint();一般要变为成员变量。

Canvas和Paint提供了如下一些方法:

Canvas canvas = new Canvas(copyBitmap); 创建一个画布的实例,传入一个bitmap的实例,必须以该实例的基础图片上作画,之前就需要把一个drawable的imageview的控件设置为bitmap。

canvas.drawBitmap(srcBitmap, new Matrix(), paint); 开始作画的参数传入,设置具体画布。

canvas.rotate(45.0f); 画布旋转角度为45度,传入为float类型。

canvas.drawPoint(200,200, paint); 在坐标(200,200)的位置画一个点。

canvas.drawColor(Color.BLACK);  设置Canvas的背景颜色为黑色,注意要与画笔颜色有点区别

canvas.drawLine(100,100,600,600,paint); 绘制直线,前2个参数为开始点坐标,后二个参数为结束点坐标。

canvas.drawRect(new Rect(150, 75, 260, 120), paint);绘制矩形 ,对角线点绘制矩形,只需要确定矩形对角线的起始点和结束点。将二点坐标传入

到Rect的实例中,矩形api:Rect(int left, int top, int right, int bottom)Create a new rectangle with the specified coordinates.

 canvas.drawRoundRect(new RectF(200,200,1000,800),15,15,paint) ;参数前面一样是矩形的创建参数,后面第一个15为圆角椭圆X轴的值,第二个

15为圆角椭圆Y轴的值。若相等就是为R为15的圆角。圆角矩形api:

RectF(float left, float top, float right, float bottom)Create a new rectangle with the specified coordinates.

canvas.drawCircle(900,900,500,paint); 绘制圆形,参数为:圆心X轴坐标,圆心Y轴指标,圆的半径

drawOval(float left, float top,float right, float bottom,,Paint paint) 绘制椭圆:设置椭圆的边界顶点,float left, float top,第一个椭圆长边或者短边的顶点

float right, float bottom为椭圆长边或者短边的顶点。

paint.setColor(Color.RED);设置画笔颜色

paint.setStrokeWidth(20);设置画笔粗细

通过Path类的实例创建三角形

绘制三角形或者多边形,通过点的方法

path.MoveTo(0,0);设置画笔起点;path.LineTo(8,0);设置画笔到该点的路径;path.LineTo(8,6);设置路径(8,0)到(8,6);

path.close();将绘制的线形成封闭空间.canvas.drawPath(path, paint);画出三角形

paint.setStyle(Paint.Style.STROKE);风格样式为描边;paint.setStyle(Paint.Style.FILL)风格样式为填充 

paint.setStyle(Paint.Style.FILL_AND_STROKE): 填充且描边

paint.setAntiAlias(true);是否设置抗锯齿,设置抗锯齿会使图像边缘更清晰一些,锯齿痕迹不会那么明显。


例子:一个小画板案列:

<span style="font-size:18px;">package com.example.point;

import java.io.File;
import java.io.FileOutputStream;

import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.Bitmap.CompressFormat;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.widget.ImageView;
import android.widget.Toast;

public class MainActivity extends Activity {
	private ImageView iv;
	private Bitmap srcBitmap;
	private Bitmap copyBitmap;
	private Canvas canvas;
	private Paint paint;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		//1,找到控件
		iv = (ImageView) findViewById(R.id.iv);
		//2 把bg转换成bitmap 
		srcBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.hua);
		//2.1创建模板 
		copyBitmap = Bitmap.createBitmap(srcBitmap.getWidth(), srcBitmap.getHeight(), srcBitmap.getConfig());
		//2.2以copybitmap为模板  创建一个画布
		canvas = new Canvas(copyBitmap);
		//2.3创建画笔
		paint = new Paint();
		//2,4开始画
		canvas.drawBitmap(srcBitmap, new Matrix(), paint);
		
		
		//3,把copebitmap显示到iv上
		iv.setImageBitmap(copyBitmap);
		//4,设置iv一个触摸事件
		iv.setOnTouchListener(new OnTouchListener() {
			int startX = 0;
			int startY = 0;
			@Override
			public boolean onTouch(View v, MotionEvent event) {
				//5,获取手指触摸的事件类型
				int action = event.getAction();
				//6,具体判断是那个类型
				switch (action) {
				case MotionEvent.ACTION_DOWN://按下
					//7,获取手指按下的坐标
					startX= (int) event.getX();
					startY=(int) event.getY();
					
					break;
				case MotionEvent.ACTION_MOVE://移动
					//8,获取停止的坐标
					int stopX = (int) event.getX();
					int stopY = (int) event.getY();
					
					//9,画线 
					canvas.drawLine(startX, startY, stopX, stopY, paint);
					//9.1更新坐标
					startX = stopX;
					startY = stopY;
					
					//10,再更新UI
					iv.setImageBitmap(copyBitmap);
					break;
				case MotionEvent.ACTION_UP://抬起
					break;

				}
				return true;
			}
		});
		
	}
	
	//点击按钮改变画笔的颜色为红色
	public void click1(View v) {
		paint.setColor(Color.RED);
	}
	
	//让画笔变粗
	public void click2(View v) {
		paint.setStrokeWidth(20);
		
	}
	
	//保存文件
	public void click3(View v) {
		/*
		 * format  保存图片的格式
		 * 
		 * quality  保存照片的质量
		 * 
		 * stream 定义流保存
		 */
		try {
			File file = new File(Environment.getExternalStorageDirectory().getPath(),"huahua.png");
			FileOutputStream fos;
			fos = new FileOutputStream(file);
			copyBitmap.compress(CompressFormat.PNG, 100, fos);
			
			//发送广播更新图库,模拟发送sd卡被卸载重新装载 图库会收到广播加载sd卡图片
			Intent intent = new Intent();
			//设置action
			intent.setAction(Intent.ACTION_MEDIA_MOUNTED);
			//设置data 
			intent.setData(Uri.fromFile(Environment.getExternalStorageDirectory()));
			
			//发送无序广播
			sendBroadcast(intent);
			
			fos.close();
			Toast.makeText(getApplicationContext(), "成功保存", 3).show();
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		
	}


}</span>


fragment的用法

Fragment的生命周期, 每一个fragments 都有自己的一套生命周期回调方法和处理自己的用户输入事件。他可以比如成一个小的activity。

画布的用法和fragment用法

介绍一下相比activity多出的方法:

onAttach()

当fragment被加入到activity时调用(在这个方法中可以获得所在的activity)。

onCreateView()

当activity要得到fragment的layout时,调用此方法,fragment在其中创建自己的layout(界面)。必须要实现该方法。

onActivityCreated()

当activity的onCreated()方法返回后调用此方法。

onDestroyView()

当fragment的layout被销毁时被调用。

onDetach()

当fragment被从activity中删掉时被调用

要记住的有两点:

a、使用Fragment必须重写onCreateView方法
b、还可以重写一个ondestroy方法 做一些收尾的工作

使用fragment:分为动态和静态
注: fragment是安卓3.0(11版本)引入的,所以最低运行环境需要在清单文件修改
若需要向低版本兼容的话,要引入v4的jar包。并注意一下几点:
[1]定义fragment继承V4包中的Fragment
[2]定义的activity要继承v4包中的FragmentActivity
[3]通过这个方法getSupportFragmentManager 获取Fragment的管理者
静态:
1、继承Fragment,重写onCreateView决定Fragemnt的布局
2、在Activity中声明此Fragment,就当和普通的View一样。
3、在布局文件中画出fragment
举例子:
静态绑定中布局要写好,先看布局:
主布局
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <fragment android:name="com.itheima.fragment.Fragment1"
            android:id="@+id/list"
            android:layout_weight="1"
            android:layout_width="0dp"
            android:layout_height="match_parent" />
    <fragment android:name="com.itheima.fragment.Fragment2"
            android:id="@+id/viewer"
            android:layout_weight="1"
            android:layout_width="0dp"
            android:layout_height="match_parent" />
</LinearLayout>
fragment1布局:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >
    
    <TextView 
         android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="我是fragment1里面的内容"
        />
    

</LinearLayout>
fragment2布局:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >
    
    <TextView 
         android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="我是fragment222里面的内容"
        />
    

</LinearLayout>
在分别写出fragment1和fragment2继承与fragment类
package com.itheima.fragment;

import android.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

//定义一个Fragment 
public class Fragment2 extends Fragment {

	//当用户第一次画ui的时候调用  要显示Fragment自己的内容  setContentView(R.layout.activity_main);
	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container,
			Bundle savedInstanceState) {
		//[1]通过打气筒把一个布局转换成view对象 
		View view = inflater.inflate(R.layout.fragment2, null);
		
		
		return view;
	}
}

package com.itheima.fragment;

import android.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

//定义一个Fragment 
public class Fragment1 extends Fragment {

	//当用户第一次画ui的时候调用  要显示Fragment自己的内容  setContentView(R.layout.activity_main);
	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container,
			Bundle savedInstanceState) {
		//[1]通过打气筒把一个布局转换成view对象 
		View view = inflater.inflate(R.layout.fragment1, null);
		
		
		return view;
	}
}

主Activity都什么不需要写。
静态的关键就是:把Fragment当成普通的View一样声明在Activity的布局文件中,然后所有控件的事件处理等代码都由各自的Fragment去处理。不管activity什么事。

动态绑定:
使用FragmentManager对Fragment进行了动态的加载,再用事务FragmentTransaction完成fragment布局显示。
1、继承Fragment,重写onCreateView决定Fragemnt的布局
2、在activity中划出一块区间给fragment显示,不需要定义布局
3、在布局文件中画出fragment
4、通过fragment管理类和事务类进行动态加载出fragmen布局
例子:以微信的界面为例:
先看布局文件:
主布局:划出空间给fragment,和定义了微信的4个按钮
<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"
    tools:context="com.example.weixin.MainActivity" >
    
    <LinearLayout 
        android:id="@+id/ll"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">
        
    </LinearLayout>
    
    <LinearLayout 
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        android:layout_alignParentBottom="true">
        
        <Button 
            android:id="@+id/btn_wx"
            android:layout_weight="1"
            android:layout_width="@dimen/zero"
            android:layout_height="wrap_content"
            android:text="微信"/>
        <Button 
            android:id="@+id/btn_contact"
            android:layout_width="@dimen/zero"
            android:layout_weight="1"
            android:layout_height="wrap_content"
            android:text="联系人"/>
        <Button 
            android:id="@+id/btn_discover"
            android:layout_width="@dimen/zero"
            android:layout_weight="1"
            android:layout_height="wrap_content"
            android:text="发现"/>
        <Button 
            android:id="@+id/btn_me"
            android:layout_width="@dimen/zero"
            android:layout_weight="1"
            android:layout_height="wrap_content"
            android:text="我"/>
        
    </LinearLayout>

  
</RelativeLayout>
微信的fragmen:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >
    
    <TextView 
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="这是微信模块"/>
    
    <Button 
        android:id="@+id/btn_test"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="测试按钮"/>
   
</LinearLayout>
联系人fragment:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >
    
    <TextView 
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="这是联系人模块"/>
    
</LinearLayout>
发现fragment:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >
    
    <TextView 
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="这是发现模块"/>
    
</LinearLayout>
Me的fragment:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >
    
    <TextView 
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="这是我的模块"
        />
    
</LinearLayout>

4个按钮的fragment对应了4个类去继承fragment:
微信的fragment类:一样可以设置点击事件,是依附于activity的特性
package com.example.weixin;

import android.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.Toast;

public class WxFragment extends Fragment {
	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
		
		
		View view = inflater.inflate(R.layout.fragment_wx, null);
		view.findViewById(R.id.btn_test).setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				Toast.makeText(getActivity(), "我被点击了", 1).show();
			}
		});
		return view;
	}
}
联系人的fragment类:
package com.example.weixin;

import android.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

public class ContactFragment extends Fragment {
	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
		
		View view = inflater.inflate(R.layout.fragment_contact, null);
		
		return view;
	}
}
发现的fragment类:
package com.example.weixin;

import android.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

public class DiscoverFragment extends Fragment {
	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
		
		View view = inflater.inflate(R.layout.fragment_discover, null);
		
		return view;
	}
}
我的fragment类:
package com.example.weixin;

import android.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

public class MeFragment extends Fragment {
	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
		
		View view = inflater.inflate(R.layout.fragment_me, null);
		
		return view;
	}
}

主Activity:4个按钮点击事件,显示fragment模块
package com.example.weixin;

import android.app.Activity;
import android.app.Fragment;
import android.app.FragmentManager;
import android.app.FragmentTransaction;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class MainActivity extends Activity implements OnClickListener {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		// 1找到控件
		Button btn_contact = (Button) findViewById(R.id.btn_contact);
		Button btn_discover = (Button) findViewById(R.id.btn_discover);
		Button btn_wx = (Button) findViewById(R.id.btn_wx);
		Button btn_me = (Button) findViewById(R.id.btn_me);

		// 2设置点击事件
		btn_contact.setOnClickListener(this);
		btn_discover.setOnClickListener(this);
		btn_wx.setOnClickListener(this);
		btn_me.setOnClickListener(this);
	}

	@Override
	public void onClick(View v) {

		// 3判断哪一个点击事件
		
		//4,获取fragment的管理者
		FragmentManager fragmentManager =getFragmentManager();
		//5,开启事务
		FragmentTransaction transaction =fragmentManager.beginTransaction();
		switch (v.getId()) {
		case R.id.btn_wx://显示微信fragment
			transaction.replace(R.id.ll, new WxFragment());
			break;
		case R.id.btn_contact://显示联系人fragment
			transaction.replace(R.id.ll, new ContactFragment());
			break;
		case R.id.btn_discover://显示发现fragment
			transaction.replace(R.id.ll, new DiscoverFragment());
			break;
		case R.id.btn_me://显示我fragment
			transaction.replace(R.id.ll, new MeFragment());
			break;

		}
		//6,一定要提交事务
		transaction.commit();
	}

}

看下效果图:
画布的用法和fragment用法

fragment之间的数据传输:
直接看例子:通过管理类和事务类的标签进行操作的
布局文件比较简单,不予给出
主Activity:
package com.example.communication;

import android.app.Activity;
import android.app.Fragment;
import android.app.FragmentManager;
import android.app.FragmentTransaction;
import android.os.Bundle;

public class MainActivity extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		//1,开启Fragment的管理者
		FragmentManager fragmentManager =getFragmentManager();
		//2,开启事务
		FragmentTransaction transaction = fragmentManager.beginTransaction();
		//3,动态替换
		transaction.replace(R.id.ll1,new Fragment1(),"f1");//给fragment1设置标签f1
		transaction.replace(R.id.ll2,new Fragment2(),"f2");//给fragment2设置标签f2

		//4,提交事务
		transaction.commit();
	}

}
fragment1类:通过activity公共桥梁完成修改
package com.example.communication;

import android.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.Toast;

public class Fragment1 extends Fragment {
	
	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
		
		View view = inflater.inflate(R.layout.fragment1, null);
		
		//1,找到按钮 设置点击事件
		view.findViewById(R.id.button1).setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				Toast.makeText(getActivity(), "修改了数据", 1).show();
				
				//2修改fragment的textview的值
				Fragment2 f2 = (Fragment2)getActivity().getFragmentManager().findFragmentByTag("f2");
				f2.setText("hahahahah");
			}
		});
		
		return view;
	}
}
fragment2类:
import android.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

public class Fragment2 extends Fragment {
	
	private TextView tv;

	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
		
		View view = inflater.inflate(R.layout.fragment2, null);
		
		tv = (TextView) view.findViewById(R.id.tv);
		
		return view;
	}
	//修改text方法
	public void setText(String content){
		tv.setText(content);
	}
}

看下结果:
初始值为Hello world!
画布的用法和fragment用法
修改后:修改成hahahahah

画布的用法和fragment用法

补间动画和属性动画:
补间动画(Tween Animation):补间动画与帧动画本质上是不同的,帧动画通过连续播放图片模式动画的效果,而补间动画则是通过在两个关键帧之间补充的动画效果来实现的。布局动画可以节省空间,而帧动画可以播放动态图。
而能支持的动画效果也只有以下5中效果:
AlphaAnimation:透明度(alpha)渐变效果,对应<alpha/>标签。

TranslateAnimation:位移渐变,需要指定移动点的开始和结束坐标,对应<translate/>标签。

ScaleAnimation:缩放渐变,可以指定缩放的参考点,对应<scale/>标签。

RotateAnimation:旋转渐变,可以指定旋转的参考点,对应<rotate/>标签。

AnimationSet:组合渐变,支持组合多种渐变效果,对应<set/>标签。

下面通过java封装实现的方法:
import android.os.Bundle;
import android.app.Activity;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.animation.AlphaAnimation;
import android.view.animation.Animation;
import android.view.animation.AnimationSet;
import android.view.animation.RotateAnimation;
import android.view.animation.ScaleAnimation;
import android.view.animation.TranslateAnimation;
import android.widget.ImageView;
import android.widget.Toast;

public class MainActivity extends Activity {

	private ImageView iv;


	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		//执行我们的动画
		iv = (ImageView) findViewById(R.id.iv);
		
		//设置一个点击事件
		iv.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				Toast.makeText(getApplicationContext(), "哈哈 你点不到我", 1).show();
			}
		});
	}


	//点击按钮 实现iv 透明的效果  动画 
	public void click1(View v) { 
		//1.0意味着着完全不透明 0.0意味着完全透明
		AlphaAnimation aa = new AlphaAnimation(1.0f, 0.0f);
		aa.setDuration(2000); //设置动画执行的时间
		aa.setRepeatCount(1); //设置重复的次数
		aa.setRepeatMode(Animation.REVERSE);//设置动画执行的模式
		//iv开始执行动画 
		iv.startAnimation(aa);
		
	}
	

	//点击按钮 实现iv 执行一个旋转 动画 
	public void click2(View v) { 
		//fromDegrees 开始角度   toDegrees 结束角度
//		RotateAnimation  ra = new RotateAnimation(0, 360);	
		RotateAnimation ra = new RotateAnimation(0, 360, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
		ra.setDuration(2000); //设置动画执行的时间
		ra.setRepeatCount(1); //设置重复的次数
		ra.setRepeatMode(Animation.REVERSE);//设置动画执行的模式
		//iv开始执行动画 
		iv.startAnimation(ra);
		
	}
	
	//点击按钮进行一个缩放动画
	public void click3(View v) { 
		ScaleAnimation sa = new ScaleAnimation(1.0f,2.0f, 1.0f, 2.0f, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
		sa.setDuration(2000); //设置动画执行的时间
		sa.setRepeatCount(1); //设置重复的次数
		sa.setRepeatMode(Animation.REVERSE);//设置动画执行的模式
		//iv开始执行动画 
		iv.startAnimation(sa);
	}

	//位移动画 
	public void click4(View v){
		TranslateAnimation ta = new TranslateAnimation(Animation.RELATIVE_TO_PARENT, 0, Animation.RELATIVE_TO_PARENT, 0, Animation.RELATIVE_TO_PARENT, 0, Animation.RELATIVE_TO_PARENT, 0.2f);
 		ta.setDuration(2000); //设置动画执行的时间
 		ta.setFillAfter(true);//当动画结束后 动画停留在结束位置
 		
 		//开始动画
 		iv.startAnimation(ta);
	}
	
	//动画一起飞
	public void click5(View v){
		AnimationSet set = new AnimationSet(false);
		
		//透明动画
		AlphaAnimation aa = new AlphaAnimation(1.0f, 0.0f);
		aa.setDuration(2000); //设置动画执行的时间
		aa.setRepeatCount(1); //设置重复的次数
		aa.setRepeatMode(Animation.REVERSE);//设置动画执行的模式
		//旋转动画
		RotateAnimation ra = new RotateAnimation(0, 360, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
		ra.setDuration(2000); //设置动画执行的时间
		ra.setRepeatCount(1); //设置重复的次数
		ra.setRepeatMode(Animation.REVERSE);//设置动画执行的模式
		//缩放
		ScaleAnimation sa = new ScaleAnimation(1.0f,2.0f, 1.0f, 2.0f, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
		sa.setDuration(2000); //设置动画执行的时间
		sa.setRepeatCount(1); //设置重复的次数
		sa.setRepeatMode(Animation.REVERSE);//设置动画执行的模式
		
		TranslateAnimation ta = new TranslateAnimation(Animation.RELATIVE_TO_PARENT, 0, Animation.RELATIVE_TO_PARENT, 0, Animation.RELATIVE_TO_PARENT, 0, Animation.RELATIVE_TO_PARENT, 0.2f);
 		ta.setDuration(2000); //设置动画执行的时间
 		ta.setFillAfter(true);//当动画结束后 动画停留在结束位置
 		
		//添加动画
		set.addAnimation(aa);
		set.addAnimation(ra);
		set.addAnimation(sa);
		set.addAnimation(ta);
		
		//最后一步 要记得 执行动画
		iv.startAnimation(set);
		
		
	}
}
 
  
通过xml的形式定义补间动画的效果:在res下创建一个目录:anim   在该目录中写出动画效果的xml文件
alpha.xml  透明动画
<span style="font-size:24px;"><?xml version="1.0" encoding="utf-8"?>
<alpha
    android:fromAlpha="1.0"
    android:toAlpha="0.0"
    android:duration="2000"
    android:repeatMode="reverse"
    android:repeatCount="1"
    xmlns:android="http://schemas.android.com/apk/res/android">
    

</alpha></span>
rotate.xml  旋转动画
<span style="font-size:24px;"><?xml version="1.0" encoding="utf-8"?>
<rotate
    android:fromDegrees="0"
    android:toDegrees="360"
    android:pivotX="50%"
    android:pivotY="50%"
    android:repeatCount="1"
    android:repeatMode="reverse"
    android:duration="2000"
    xmlns:android="http://schemas.android.com/apk/res/android">
    

</rotate></span>
scale.xml  缩放动画
<span style="font-size:24px;"><?xml version="1.0" encoding="utf-8"?>
<scale
    android:fromXScale="1.0"
    android:toXScale="2.0"
    android:fromYScale="1.0"
    android:toYScale="2.0"
    android:pivotX="50%"
    android:pivotY="50%"
    android:repeatMode="reverse"
    android:repeatCount="1"
    android:duration="2000"
    xmlns:android="http://schemas.android.com/apk/res/android">
    

</scale></span>
translate.xml  平移动画
<?xml version="1.0" encoding="utf-8"?>
<translate
    android:fromXDelta="0%p"
    android:toXDelta="0%p"
    android:fromYDelta="0%p"
    android:toYDelta="20%p"
    
    android:fillAfter="true"
    android:duration="2000"
    xmlns:android="http://schemas.android.com/apk/res/android">
    
</translate>
综合效果动画:set.xml
<span style="font-size:24px;"><?xml version="1.0" encoding="utf-8"?>
<set>

    <alpha
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:duration="2000"
        android:fromAlpha="1.0"
        android:repeatCount="1"
        android:repeatMode="reverse"
        android:toAlpha="0.0" >
    </alpha>

    <rotate
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:duration="2000"
        android:fromDegrees="0"
        android:pivotX="50%"
        android:pivotY="50%"
        android:repeatCount="1"
        android:repeatMode="reverse"
        android:toDegrees="360" >
    </rotate>

    <scale
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:duration="2000"
        android:fromXScale="1.0"
        android:fromYScale="1.0"
        android:pivotX="50%"
        android:pivotY="50%"
        android:repeatCount="1"
        android:repeatMode="reverse"
        android:toXScale="2.0"
        android:toYScale="2.0" >
    </scale>

    <translate
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:duration="2000"
        android:fillAfter="true"
        android:fromXDelta="0%p"
        android:fromYDelta="0%p"
        android:toXDelta="0%p"
        android:toYDelta="20%p" >
    </translate>

</set></span>


动画效果不会改变控件真实的坐标  是补间动画的特性。用xml文件写动画时,要放在res目录下创建anim文件中

属性动画:当需要真正的移动动画,或者改变动画的属性,则需要属性动画来操作,本质上跟补间动画没有什么区别,但特性一定要记住:属性动画会改变控件真实的坐标 。跟补间动画一样,同样有缩放、平移、旋转、透明和总和属性动画效果,通过ObjectAnimator的实例来操作的:代码如下:
<span style="font-size:24px;">package com.example.propertyanimator;

import android.os.Bundle;
import android.animation.AnimatorInflater;
import android.animation.AnimatorSet;
import android.animation.ObjectAnimator;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.animation.AnimationUtils;
import android.widget.ImageView;
import android.widget.Toast;

public class MainActivity extends Activity {

	private ImageView iv;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		//加载的布局
		setContentView(R.layout.activity_main);
		
		//找到iv 执行动画
		iv = (ImageView) findViewById(R.id.iv);
		//设置了一个点击事件
		iv.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				
				Toast.makeText(MainActivity.this, "你点不到我", 0).show();
			}
		});
		

//		iv.setTranslationX(translationX)
//		iv.setScaleX(scaleX)
//		iv.setAlpha(alpha)
//		iv.setRotation(rotation)
		
		
	}

	//位移动画
	public void translate(View v){
		//创建属性动画
		/**
		 * target 执行的目标  
		 * propertyName 属性名字  The name of the property being animated.
		 * float... values 可变参数 
		 */
		ObjectAnimator oa = ObjectAnimator.ofFloat(iv, "translationX", 10, 50,20,100);
		oa.setDuration(2000);
		oa.start(); //开始动画
		
	}
	//缩放动画
	public void scale(View v){
		
		ObjectAnimator oa = ObjectAnimator.ofFloat(iv, "scaleY", 0.1f, 2, 1, 2);
		oa.setDuration(2000);
		oa.start();
	}
	
	//实现透明的效果 
	public void alpha(View v){
		ObjectAnimator oa = ObjectAnimator.ofFloat(iv, "alpha", 0, 0.5f, 0, 1,0,1);
		oa.setDuration(2000);
		oa.start();
	}
	
	//实现旋转的效果
	public void rotate(View v){
//		ObjectAnimator oa = ObjectAnimator.ofFloat(iv, "rotation", 0, 180, 90, 360);
		ObjectAnimator oa = ObjectAnimator.ofFloat(iv, "rotationX", 0, 180, 90, 360);
		oa.setDuration(2000);
		oa.start();
	}
	
	
	//一起飞 
	public void fly(View v){
		AnimatorSet as = new AnimatorSet();
		ObjectAnimator oa = ObjectAnimator.ofFloat(iv, "translationX", 10, 50, 20, 100);
		ObjectAnimator oa2 = ObjectAnimator.ofFloat(iv, "scaleY", 0.1f, 2, 1, 2);
		ObjectAnimator oa3 = ObjectAnimator.ofFloat(iv, "alpha", 0, 0.5f, 0, 1);
		ObjectAnimator oa4 = ObjectAnimator.ofFloat(iv, "rotationY", 0, 180, 90, 360);
		as.setDuration(2000);//执行动画时长
		as.setTarget(iv);//iv执行动画
		//往集合中添加动画
		//挨个飞
		as.playSequentially(oa, oa2, oa3, oa4);
		//一起飞
//		as.playTogether(oa, oa2, oa3, oa4);
		as.start();
	}
	
	//使用xml的方式创建属性动画
	public void playxml(View v){
		
		ObjectAnimator oa = (ObjectAnimator) AnimatorInflater.loadAnimator(this, R.animator.oanimator);
		//设置执行目标
		oa.setTarget(iv);
		oa.start();//开始执行
	}
}</span>
同样也可以在xml中创建一个动画效果来展示,需要在res下创建一个animator目录。
<span style="font-size:24px;"><?xml version="1.0" encoding="utf-8"?>
<animator xmlns:android="http://schemas.android.com/apk/res/android" >
    <objectAnimator 
        android:propertyName="translationX"
        android:duration="2000"
        android:valueFrom="10"
        android:valueTo="100"
        ></objectAnimator>

</animator></span>


动画总结属性动画会改变控件真实的坐标
如果使用xml方式定义属性动画 要在res下创建一个animator目录
动画效果不会改变控件真实的坐标  
如果使用xml方式定义属性动画 要在res下创建一个anim目录


总结:画布的几种图形方法要知道及其参数对应含义,fragment的动态和静态用法要掌握!