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#