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#

优质内容筛选与推荐>>
1、Struts的JSP页面标签<html:errors/>的使用方法
2、Mono For Android TableLayout
3、浅谈:从为什么学习python到如何学好python
4、Android数据存储引擎---SQLite数据库
5、客户端javascript


长按二维码向我转账

受苹果公司新规定影响,微信 iOS 版的赞赏功能被关闭,可通过二维码转账支持公众号。

    阅读
    好看
    已推荐到看一看
    你的朋友可以在“发现”-“看一看”看到你认为好看的文章。
    已取消,“好看”想法已同步删除
    已推荐到看一看 和朋友分享想法
    最多200字,当前共 发送

    已发送

    朋友将在看一看看到

    确定
    分享你的想法...
    取消

    分享想法到看一看

    确定
    最多200字,当前共

    发送中

    网络异常,请稍后重试

    微信扫一扫
    关注该公众号





    联系我们

    欢迎来到TinyMind。

    关于TinyMind的内容或商务合作、网站建议,举报不良信息等均可联系我们。

    TinyMind客服邮箱:support@tinymind.net.cn