ANDROID 实现开场动画
我们常常会在打开某些应用的时候看到标记有 开发公司LOGO 的一个开场动画,通常都能留下一个比较深刻的印象。比较好的效果就是 LOGO 由透明变深色。

下面来看看代码的具体实现:
首先,在main.java 中,如下代码:
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.util.DisplayMetrics;
import android.widget.Toast;
public class main extends Activity {
public MyView myView = null;
private Context mContext;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
DisplayMetrics dm = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dm);
//自定义CommonVal类,里面存放2个静态变量 屏幕的长和高,方便代码调用
CommonVal.screenWidth = dm.widthPixels;
CommonVal.screenHigh = dm.heightPixels;
mContext = this.getApplicationContext();
setContentView(R.layout.main);
myView = (MyView)this.findViewById(R.id.myview);
//开始一个线程 r
new Thread(r).start();
}
//线程r等待5秒,如果在这个过程中有别的逻辑,例如检查网络,检查版本,也可以放在这个线程内执行
Runnable r = new Runnable(){
@Override
public void run(){
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
e.printStackTrace();
}
//5秒过后运行forwardTo方法
forwardTo();
}
};
//Activity 跳转
public void forwardTo(){
//TODO finish anim, and then start new Activity
Intent intent = new Intent(main.this,SecondActivity.class);
startActivity(intent);
this.finish();
}
//当Activity 跳转的时候,运行 onStop 方法
@Override
protected void onStop() {
super.onStop();
myView.stopThread();
this.finish();
}
}
看一下,这个界面的LAYOUT 布局文件 main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<com.thinkland.openanim.demo.MyView android:id="@+id/myview"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</LinearLayout>
自定义一个MyView,里面绘制 LOGO 图案, 代码如下:
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.RectF;
import android.graphics.Bitmap.Config;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;
public class MyView extends View implements Runnable{
public Bitmap open_bp;
private Paint pt = new Paint(Paint.ANTI_ALIAS_FLAG);
float x, y;
private boolean flag;
private RectF r = null;
private int compareWidth;
public MyView(Context context, AttributeSet attrs) {
super(context, attrs);
flag = true;
open_bp = BitmapFactory.decodeResource(getResources(), R.drawable.open_logo);
compareWidth = (int) (CommonVal.screenWidth * 0.6);
bitmapDecode();
//确定LOGO 的显示位置
x = ( CommonVal.screenWidth - open_bp.getWidth() ) / 2f;
y = ( CommonVal.screenHigh - open_bp.getHeight() ) / 3f;
//绘制一个Rect
r = new RectF(0, 0, CommonVal.screenWidth, CommonVal.screenHigh);
new Thread(this).start();
}
//绘制LOGO
@Override
public void onDraw(Canvas c){
c.drawColor(Color.WHITE);
c.drawBitmap(open_bp, x, y, pt);
}
private int i = 0;
@Override
public void run() {
while(flag){
//透明度变化
open_bp = setAlpha(open_bp, 5 + 5 * i);
i++;
if(i>40){
i=40;
//由于通过改变RGB 的方式来控制透明度,图片边角会变模糊,所以当图片完全显示后这里重新读取图片覆盖掉变模糊的,如果有网友有好的解决方法,欢迎提出
open_bp = BitmapFactory.decodeResource(getResources(), R.drawable.open_logo);
bitmapDecode();
}
this.postInvalidate();
try{
Thread.sleep(50);
}catch (Exception e) {
Thread.currentThread().interrupt();
e.printStackTrace();
}
}
}
//当main.java里的onStop方法调用,停止thread,flag 设置为false
public void stopThread() {
flag = false;
}
//设置透明度
public Bitmap setAlpha(Bitmap sourceImg, int number) {
int[] argb = new int[sourceImg.getWidth() * sourceImg.getHeight()];
sourceImg.getPixels(argb, 0, sourceImg.getWidth(), 0, 0,sourceImg.getWidth(), sourceImg.getHeight());//
for (int i = 0; i < argb.length; i++) {
if ( ( argb[i] | 0x00000000 ) != 0) {
argb[i] = (number << 24) | (argb[i] & 0x00FFFFFF);
}
}
Bitmap resizedBitmap = sourceImg;
sourceImg = Bitmap.createBitmap(argb, sourceImg.getWidth(), sourceImg.getHeight(), Config.ARGB_8888);
if (sourceImg != resizedBitmap) {
resizedBitmap.recycle();
resizedBitmap = null;
} else {
Log.v("sssss", "------------ the same bitmap address");
}
return sourceImg;
}
//图片尺寸转换
public void bitmapDecode(){
if (compareWidth < open_bp.getWidth()) {
float scaleWidth = (float) 0.6;
// float scaleHeight = (float) canvas_W/bm.getHeight();
Matrix matrix = new Matrix();
matrix.postScale(scaleWidth, scaleWidth);
Bitmap bmold = open_bp;
open_bp = Bitmap.createBitmap(open_bp, 0, 0, open_bp.getWidth(), open_bp
.getHeight(), matrix, true);
bmold.recycle();
bmold = null;
}
}
}
最后就可以实现一个LOGO 由透明慢慢 颜色变深的一个动画效果了,整个项目代码如下:
http://u.115.com/file/aqb3oiq4#
posted on 2011-06-22 10:52 thinkland001 阅读(518) 评论(0) 收藏 举报
浙公网安备 33010602011771号