1.补间动画(Tween)与帧动画(Frame)
在res下新建一个anim文件夹,自定义四种动画的xml文件
alph_anim.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" android:duration="3000"></alpha> </set>
<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android" > <scale android:duration="3000" android:fillEnabled="false" android:fromXScale="0.0" android:fromYScale="0.0" android:toXScale="1.0" android:toYScale="1.0" android:pivotX="50%" android:pivotY="50%" > </scale> </set>
'
<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android" > <translate android:duration="3000" android:fromXDelta="0.0" android:fromYDelta="0.0" android:toXDelta="300" android:toYDelta="300"> </translate> </set>
<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android" > <rotate android:duration="3000" android:fromDegrees="0" android:toDegrees="360" android:pivotX="50%" android:pivotY="50%"> </rotate> </set>
<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" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context="com.example.animationtest.MainActivity" > <ImageView android:id="@+id/imageView1" android:layout_width="match_parent" android:layout_height="match_parent" android:src="@drawable/c" android:onClick="click"/> </RelativeLayout>
package com.example.animationtest; import android.app.Activity; import android.os.Bundle; import android.view.View; import android.view.animation.Animation; import android.view.animation.AnimationUtils; import android.widget.ImageView; public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } public void click(View view){ ImageView iv = (ImageView) view; Animation rotateAnimation = AnimationUtils.loadAnimation(this, R.anim.rotate_anim); iv.startAnimation(rotateAnimation); } }
2.属性动画
ObjectAnimator与ValueAnimator
ValueAnimator代码
activity_main
<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" > <ImageView android:id="@+id/imageView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_alignParentTop="true" android:src="@drawable/icon" android:onClick="valueAnimatonClick" /> </RelativeLayout>
package com.example.valueanimationtest; import android.animation.ValueAnimator; import android.animation.ValueAnimator.AnimatorUpdateListener; import android.app.Activity; import android.os.Bundle; import android.util.DisplayMetrics; import android.view.View; public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } public void valueAnimatonClick(View view) { final View v = view; DisplayMetrics dm = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(dm); // 定义一个动画 ValueAnimator va = ValueAnimator.ofFloat(view.getX(), dm.heightPixels, view.getY()).setDuration(500); // 监听动画的每个事件 va.addUpdateListener(new AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator animation) { // TODO Auto-generated method stub v.setTranslationY((Float) animation.getAnimatedValue()); } }); va.start(); } }
监听动画事件与AnimatorSet
插值器与XML配置动画
动画菜单案例
详见:http://blog.csdn.net/dt235201314/article/details/50534899
3.画布与绘制
几何图形与位图绘制
SurfaceView
SurfaceView播放视频案例
MainActivity
package com.example.videotest; import java.io.IOException; import android.app.Activity; import android.media.AudioManager; import android.media.MediaPlayer; import android.os.Bundle; import android.os.Environment; import android.view.SurfaceHolder; import android.view.SurfaceView; import android.view.View; public class MainActivity extends Activity implements SurfaceHolder.Callback { private SurfaceView surfaceView; private SurfaceHolder surfaceHolder; private MediaPlayer mediaPlayer; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); surfaceView = (SurfaceView) findViewById(R.id.surfaceView1); surfaceHolder = surfaceView.getHolder();// surfaceHolder是surfaceView的控制接口 surfaceHolder.addCallback(this); surfaceHolder.setFixedSize(320, 220);//设置视频分辨率 } public void playClick(View view) { mediaPlayer.start(); } public void pauseClick(View view) { mediaPlayer.pause(); } public void stopClick(View view) { mediaPlayer.stop(); } @Override public void surfaceCreated(SurfaceHolder holder) { // TODO Auto-generated method stub mediaPlayer = new MediaPlayer(); mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); mediaPlayer.setDisplay(surfaceHolder); String path = Environment .getExternalStoragePublicDirectory(Environment.DIRECTORY_MOVIES) + "/mymovie.mp4"; try { mediaPlayer.setDataSource(path); mediaPlayer.prepare(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { // TODO Auto-generated method stub } @Override public void surfaceDestroyed(SurfaceHolder holder) { // TODO Auto-generated method stub if(mediaPlayer!=null){ if(mediaPlayer.isPlaying()){ mediaPlayer.stop(); mediaPlayer.release(); } } } @Override protected void onDestroy() { // TODO Auto-generated method stub super.onDestroy(); if(mediaPlayer!=null){ if(mediaPlayer.isPlaying()){ mediaPlayer.stop(); mediaPlayer.release(); } } } }
<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" > <SurfaceView android:id="@+id/surfaceView1" android:layout_width="wrap_content" android:layout_height="250dp" android:layout_alignParentLeft="true" android:layout_alignParentRight="true" android:layout_alignParentTop="true" /> <Button android:id="@+id/button1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/surfaceView1" android:layout_centerHorizontal="true" android:onClick="playClick" android:text="播放" /> <Button android:id="@+id/button2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignBaseline="@+id/button1" android:layout_alignBottom="@+id/button1" android:layout_toLeftOf="@+id/button1" android:onClick="pauseClick" android:text="暂停" /> <Button android:id="@+id/button3" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignBaseline="@+id/button1" android:layout_alignBottom="@+id/button1" android:layout_toRightOf="@+id/button1" android:onClick="stopClick" android:text="停止" /> </RelativeLayout>
draw9patch