概述
Android 启动页过渡动画效果实现(一)
一.场景1(缩放动画-有小逐渐变大效果)(以下均贴出全部代码(图标、颜色等属性除外),复制即用)
1.效果图:
2.主要函数代码:
import android.animation.FloatEvaluator;
import android.animation.ValueAnimator;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.WindowManager;
import android.widget.ImageView;
import com.hjq.demo.R;
import com.hjq.demo.ui.activity.sgf.banner.RegionTypeDetailsActivity;
import java.util.Calendar;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.RecyclerView;
import butterknife.BindView;
import butterknife.ButterKnife;
/**
* 仿开眼短视频启动动画
* https://github.com/darryrzhong/OpenEyes
* https://github.com/forvv231/EasyScollImage
*/
public final class OpenEyesActivity extends AppCompatActivity {
@BindView(R.id.iv_bg)
ImageView imageView;
private RecyclerView mRecyclerView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//全屏
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
setContentView(R.layout.activity_guide_openeyes);
ButterKnife.bind(this);
initBackground();
startAnimation();//开启动画效果
}
private void initBackground() {
Calendar c = Calendar.getInstance();
int day = c.get(Calendar.DAY_OF_WEEK)-1;
Log.e("!!!!!!!!",day+"");
switch (day){
case 0:
imageView.setBackgroundResource(R.drawable.wallpaper_6);
break;
case 1:
imageView.setBackgroundResource(R.drawable.wallpaper_12);
break;
case 2:
imageView.setBackgroundResource(R.drawable.wallpaper_7);
break;
case 3:
imageView.setBackgroundResource(R.drawable.wallpaper_10);
break;
case 4:
imageView.setBackgroundResource(R.drawable.wallpaper_8);
break;
case 5:
imageView.setBackgroundResource(R.drawable.wallpaper_11);
break;
case 6:
imageView.setBackgroundResource(R.drawable.wallpaper_9);
break;
default:
imageView.setBackgroundResource(R.drawable.wallpaper_9);
}
}
private void startAnimation() {
final View splashIv = findViewById(R.id.iv_bg);
ValueAnimator animator = ValueAnimator.ofObject(new FloatEvaluator(),1.0f,1.2f);
animator.setDuration(3000);
animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
Float value = (Float) animation.getAnimatedValue();
if (value != 1.2f) {
splashIv.setScaleX(value);
splashIv.setScaleY(value);
} else {
goToActivity();
}
}
private void goToActivity() {
Intent intent = new Intent(OpenEyesActivity.this, RegionTypeDetailsActivity.class);
startActivity(intent);
overridePendingTransition(0, android.R.anim.fade_out);
finish();
}
});
animator.start();
}
}
3.布局代码:
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
android:id="@+id/iv_bg"
android:layout_width="match_parent"
android:layout_height="match_parent" />
android:id="@+id/spash_tv_english"
android:layout_marginTop="20dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@color/white"
android:layout_centerInParent="true"
android:textSize="25sp"
android:text="Eyepetizer" />
android:id="@+id/tv1"
android:text="Daily appetizers for your eyes,Bon eyepetit"
android:textColor="@color/white"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:layout_above="@id/textView"/>
android:layout_marginTop="20dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@color/white"
android:text="每日精选视频推介,让你大开眼界。"
android:layout_marginBottom="46dp"
android:id="@+id/textView"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true" />
4.自定义TextView
import android.annotation.SuppressLint;
import android.content.Context;
import android.content.res.AssetManager;
import android.graphics.Typeface;
import android.util.AttributeSet;
import android.widget.TextView;
import androidx.annotation.Nullable;
/**
* 自定义定制字体的TextView
*/
@SuppressLint("AppCompatCustomView")
public class CustomTextView extends TextView {
public CustomTextView(Context context) {
super(context);
init(context);
}
public CustomTextView(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
init(context);
}
public CustomTextView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init(context);
}
/*
* 定制字体
* */
private void init(Context context) {
AssetManager assets = context.getAssets();//获取资源文件
Typeface font = Typeface.createFromAsset(assets,"fonts/Lobster-1.4.otf");
setTypeface(font);
}
}
5.项目案例推荐:
TextView定制字体式样的资源文件请到GitHub上搜索(提供几个案例,直接到里面复制即可):
二.场景2(缩放动画-有小逐渐变大效果,旋转动画-360旋转)
1.效果图:
2.主函数代码:
import android.view.View;
import android.view.animation.AlphaAnimation;
import android.view.animation.Animation;
import android.view.animation.RotateAnimation;
import android.view.animation.ScaleAnimation;
import com.gyf.immersionbar.BarHide;
import com.hjq.demo.R;
import com.hjq.demo.common.MyActivity;
import com.hjq.demo.other.AppConfig;
import com.hjq.permissions.OnPermission;
import com.hjq.permissions.Permission;
import com.hjq.permissions.XXPermissions;
import java.util.List;
import butterknife.BindView;
/**
* github : https://github.com/getActivity/AndroidProject
*/
public final class SplashActivity extends MyActivity
implements OnPermission, Animation.AnimationListener {
private static final int ANIM_TIME = 1000;
@BindView(R.id.iv_splash_bg)
View mImageView;
@BindView(R.id.iv_splash_icon)
View mIconView;
@BindView(R.id.iv_splash_name)
View mNameView;
@BindView(R.id.tv_splash_debug)
View mDebugView;
@Override
protected int getLayoutId() {
return R.layout.activity_splash;
}
@Override
protected void initView() {
// 初始化动画
AlphaAnimation aa = new AlphaAnimation(0.4f, 1.0f);
aa.setDuration(ANIM_TIME * 2);
aa.setAnimationListener(this);
mImageView.startAnimation(aa);
ScaleAnimation sa = new ScaleAnimation(0, 1, 0, 1, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
sa.setDuration(ANIM_TIME);
mIconView.startAnimation(sa);
RotateAnimation ra = new RotateAnimation(180, 360, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
ra.setDuration(ANIM_TIME);
mNameView.startAnimation(ra);
// 设置状态栏和导航栏参数
getStatusBarConfig()
// 有导航栏的情况下,activity全屏显示,也就是activity最下面被导航栏覆盖,不写默认非全屏
.fullScreen(true)
// 隐藏状态栏
.hideBar(BarHide.FLAG_HIDE_STATUS_BAR)
// 透明导航栏,不写默认黑色(设置此方法,fullScreen()方法自动为true)
.transparentNavigationBar()
.init();
}
@Override
protected void initData() {
if (AppConfig.isDebug()) {
mDebugView.setVisibility(View.VISIBLE);
} else {
mDebugView.setVisibility(View.INVISIBLE);
}
}
private void requestPermission() {
XXPermissions.with(this)
.permission(Permission.Group.STORAGE)
.request(this);
}
/**
* {@link OnPermission}
*/
@Override
public void hasPermission(List granted, boolean isAll) {
startActivityFinish(HomeActivity.class);
}
@Override
public void noPermission(List denied, boolean quick) {
if (quick) {
toast(R.string.common_permission_fail);
XXPermissions.gotoPermissionSettings(SplashActivity.this, true);
} else {
toast(R.string.common_permission_hint);
postDelayed(this::requestPermission, 1000);
}
}
@Override
public void onBackPressed() {
//禁用返回键
//super.onBackPressed();
}
@Override
protected void onRestart() {
super.onRestart();
if (XXPermissions.isHasPermission(SplashActivity.this, Permission.Group.STORAGE)) {
hasPermission(null, true);
} else {
requestPermission();
}
}
/**
* {@link Animation.AnimationListener}
*/
@Override
public void onAnimationStart(Animation animation) {}
@Override
public void onAnimationEnd(Animation animation) {
requestPermission();
}
@Override
public void onAnimationRepeat(Animation animation) {}
}
3.布局代码:
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".ui.activity.SplashActivity">
android:id="@+id/iv_splash_bg"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scaleType="centerCrop"
android:src="@drawable/bg_launcher" />
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center"
android:layout_marginTop="75dp"
android:layout_marginBottom="50dp">
android:id="@+id/iv_splash_icon"
android:layout_centerHorizontal="true"
android:layout_width="200dp"
android:layout_height="200dp"
android:src="@drawable/ic_logo" />
android:id="@+id/iv_splash_name"
android:layout_below="@+id/iv_splash_icon"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="50dp"
android:gravity="center"
android:text="@string/app_name"
android:textColor="@color/white90"
android:textSize="20sp" />
android:id="@+id/tv_splash_debug"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal|bottom"
android:layout_marginBottom="30dp"
android:text="Debug"
android:textColor="@color/white80"
android:textSize="14sp"
tools:ignore="HardcodedText" />
项目案例推荐:
三.场景3(缩放动画-有小逐渐变大效果,旋转动画-360旋转)
1.效果图:
2.主函数代码:
import android.animation.FloatEvaluator;
import android.animation.ValueAnimator;
import android.annotation.SuppressLint;
import android.app.Application;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.view.WindowManager;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.widget.ImageView;
import android.widget.TextView;
import com.hjq.demo.R;
import com.hjq.demo.common.MyApplication;
import com.hjq.demo.ui.activity.sgf.banner.RegionTypeDetailsActivity;
import java.util.Calendar;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.RecyclerView;
import butterknife.BindView;
import butterknife.ButterKnife;
/**
* app启动动画系列
* https://github.com/darryrzhong/OpenEyes
* https://github.com/forvv231/EasyScollImage
*/
public final class SgfSplashActivity extends AppCompatActivity {
Animation myAnimation;
Animation backAnimation;
//用于更新在主线程的UI
@SuppressLint("HandlerLeak")
Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.arg1){
case 0: {
myAnimation = AnimationUtils.loadAnimation(MyApplication.getInstance(), R.anim.my_anim);
imgPic.startAnimation(myAnimation);
imgPic.setVisibility(View.VISIBLE);
}break;
case 1: {
myAnimation = AnimationUtils.loadAnimation(MyApplication.getInstance(), R.anim.my_anim_rotate);
// myAnimation = AnimationUtils.loadAnimation(MyApplication.getInstance(), R.anim.my_anim_translate);
context.startAnimation(myAnimation);
context.setVisibility(View.VISIBLE);
}break;
case 2: {
backAnimation = AnimationUtils.loadAnimation(MyApplication.getInstance(), R.anim.my_anim_scale);
back.startAnimation(backAnimation);
back.setVisibility(View.VISIBLE);
}break;
}
}
};
private ImageView imgPic;
private TextView back;
private TextView context;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//全屏
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
setContentView(R.layout.activity_sgf_splash);
ButterKnife.bind(this);
// //通过loadAnimation函数 把动画效果的xml文件加载进来 实例化动作类
// myAnimation = AnimationUtils.loadAnimation(this, R.anim.my_anim);
// //控件开始动作
// imgPic.startAnimation(myAnimation);
imgPic = (ImageView)findViewById(R.id.im_pic);
imgPic.setVisibility(View.INVISIBLE);
back = (TextView)findViewById(R.id.tv_back);
// back.setVisibility(View.INVISIBLE);
context = (TextView)findViewById(R.id.tv_context);
context.setVisibility(View.INVISIBLE);
new Thread(new Runnable() {
@Override
public void run() {
//进去隔一秒 出现askFood
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
Message ok = new Message();
ok.arg1 = 0;//区分更新什么UI
handler.sendMessage(ok);
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
//第一个动作执行后,隔两秒执行LWGstudio出现的动作
ok = new Message();
ok.arg1 = 1;//区分更新什么UI
handler.sendMessage(ok);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
//最后动作
ok = new Message();
ok.arg1 = 2;//区分更新什么UI
handler.sendMessage(ok);
}
}).start();
}
}
3.布局:
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:background="@drawable/wallpaper_11"
android:layout_height="match_parent">
android:id="@+id/im_pic"
android:layout_marginTop="90dp"
android:layout_centerHorizontal="true"
android:src="@drawable/ic_share_wechat"
android:layout_width="100dp"
android:layout_height="100dp" />
android:id="@+id/tv_context"
android:layout_marginTop="20dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@color/white"
android:layout_centerInParent="true"
android:textSize="25sp"
android:text="Eyepetizer" />
android:id="@+id/tv_back"
android:text="Daily appetizers for your eyes,Bon eyepetit"
android:textColor="@color/white"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:layout_above="@id/textView"/>
android:layout_marginTop="20dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@color/white"
android:text="每日精选视频推介,让你大开眼界。"
android:layout_marginBottom="46dp"
android:id="@+id/textView"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true" />
4.xml动画:
a.my_anim.xml(渐变动画)
android:duration="1000"
android:fromAlpha="0.0"
android:toAlpha="1.0" />
b.my_anim_scale.xml(缩放动画)
android:duration="1000"
android:fillAfter="false"
android:fromXScale="0.0"
android:fromYScale="0.0"
android:interpolator="@android:anim/accelerate_decelerate_interpolator"
android:pivotX="50%"
android:pivotY="50%"
android:toXScale="1.4"
android:toYScale="1.4" />
c.my_anim_rotate.xml(旋转动画)
android:duration="3000"
android:fromDegrees="0"
android:interpolator="@android:anim/accelerate_decelerate_interpolator"
android:pivotX="50%"
android:pivotY="50%"
android:toDegrees="+350" />
d.my_anim_translate.xml (平移动画)
android:duration="2000"
android:fromXDelta="30"
android:fromYDelta="30"
android:toXDelta="-80"
android:toYDelta="300" />
上图的弹性动画xml代码:(使用动画插值器)
e.my_anim_translate_bounce.xml
android:interpolator="@android:anim/bounce_interpolator">
android:duration="1000"
android:fromXDelta="500"
android:fromYDelta="0"
android:toXDelta="0"
android:toYDelta="0" />
补充:
Android内置了9种内置的插值器实现,如下所示:
动画加速进行 @android:anim/accelerate_interpolator AccelerateInterpolator
快速完成动画,超出终点后再回退到终点 @android:anim/overshoot_interpolator OvershootInterpolator
先退后再加速前进 @android:anim/anticipate_interpolator AnticipateInterpolator
先加速再减速 @android:anim/accelerate_decelerate_interpolator AccelerateDecelerateInterpolator
先退后再加速,超出终点后再回退到终点 @android:anim/anticipate_overshoot_interpolator AnticipateOvershootInterpolator
最后阶段弹球效果 @android:anim/bounce_interpolator BounceInterpolator
周期运动 @android:anim/cycle_interpolator CycleInterpolator
减速 @android:anim/decelerate_interpolator DecelerateInterpolator
匀速 @android:anim/linear_interpolator LinearInterpolator
系统默认的插值器是AccelerateDecelerateInterpolator,即先加速后减速
四.场景4(位移动画-由下到上,透明渐变)
1.效果图:
2.主函数代码:
两个activity实现的一个效果
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.view.KeyEvent;
import android.view.WindowManager;
import androidx.appcompat.app.AppCompatActivity;
/**
* app启动动画系列
* https://github.com/HMonkey1024/MyLauncher
* https://github.com/darryrzhong/OpenEyes
*/
public final class SgfSplash3Activity extends AppCompatActivity {
private Handler handler = new Handler();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//全屏
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
// 注意:此处将setContentView()方法注释掉
// setContentView(R.layout.activity_start);
handler.postDelayed(new Runnable() {
@Override
public void run() {
gotoLogin();
}
}, 2000);
}
/**
* 前往注册、登录主页
*/
private void gotoLogin() {
Intent intent = new Intent(SgfSplash3Activity.this, SgfSplash2Activity.class);
startActivity(intent);
finish();
//取消界面跳转时的动画,使启动页的logo图片与注册、登录主页的logo图片完美衔接
overridePendingTransition(0, 0);
}
/**
* 屏蔽物理返回键
*/
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
return true;
}
return super.onKeyDown(keyCode, event);
}
@Override
protected void onDestroy() {
if (handler != null) {
//If token is null, all callbacks and messages will be removed.
handler.removeCallbacksAndMessages(null);
}
super.onDestroy();
}
}
import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.animation.AnimatorSet;
import android.animation.ObjectAnimator;
import android.content.Context;
import android.os.Bundle;
import android.util.DisplayMetrics;
import android.view.KeyEvent;
import android.view.View;
import android.view.WindowManager;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import com.hjq.demo.R;
import androidx.appcompat.app.AppCompatActivity;
import butterknife.ButterKnife;
/**
* app启动动画系列
* https://github.com/HMonkey1024/MyLauncher
* https://github.com/darryrzhong/OpenEyes
*/
public final class SgfSplash2Activity extends AppCompatActivity {
private long exitTime;
private TextView tvRegister;
private TextView tvLogin;
private ImageView ivLogo;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//全屏
// getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
setContentView(R.layout.activity_sgf_splash2);
ButterKnife.bind(this);
initViews();
initAnims();
}
/**
* 初始化View控件
*/
private void initViews() {
tvLogin = (TextView) findViewById(R.id.tv_login);
tvRegister = (TextView) findViewById(R.id.tv_register);
ivLogo = (ImageView) findViewById(R.id.iv_logo);
}
/**
* 初始化logo图片以及底部注册、登录的按钮动画
*/
private void initAnims() {
//初始化底部注册、登录的按钮动画
//以控件自身所在的位置为原点,从下方距离原点200像素的位置移动到原点
ObjectAnimator tranLogin = ObjectAnimator.ofFloat(tvLogin, "translationY", 200, 0);
ObjectAnimator tranRegister = ObjectAnimator.ofFloat(tvRegister, "translationY", 200, 0);
//将注册、登录的控件alpha属性从0变到1
ObjectAnimator alphaLogin = ObjectAnimator.ofFloat(tvLogin, "alpha", 0, 1);
ObjectAnimator alphaRegister = ObjectAnimator.ofFloat(tvRegister, "alpha", 0, 1);
final AnimatorSet bottomAnim = new AnimatorSet();
bottomAnim.setDuration(1000);
//同时执行控件平移和alpha渐变动画
bottomAnim.play(tranLogin).with(tranRegister).with(alphaLogin).with(alphaRegister);
//获取屏幕高度
WindowManager manager = (WindowManager) getSystemService(Context.WINDOW_SERVICE);
DisplayMetrics metrics = new DisplayMetrics();
manager.getDefaultDisplay().getMetrics(metrics);
int screenHeight = metrics.heightPixels;
//通过测量,获取ivLogo的高度
int w = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED);
int h = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED);
ivLogo.measure(w, h);
int logoHeight = ivLogo.getMeasuredHeight();
//初始化ivLogo的移动和缩放动画
float transY = (screenHeight - logoHeight) * 0.28f;
//ivLogo向上移动 transY 的距离
ObjectAnimator tranLogo = ObjectAnimator.ofFloat(ivLogo, "translationY", 0, -transY);
//ivLogo在X轴和Y轴上都缩放0.75倍
ObjectAnimator scaleXLogo = ObjectAnimator.ofFloat(ivLogo, "scaleX", 1f, 0.75f);
ObjectAnimator scaleYLogo = ObjectAnimator.ofFloat(ivLogo, "scaleY", 1f, 0.75f);
AnimatorSet logoAnim = new AnimatorSet();
logoAnim.setDuration(1000);
logoAnim.play(tranLogo).with(scaleXLogo).with(scaleYLogo);
logoAnim.start();
logoAnim.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
super.onAnimationEnd(animation);
//待ivLogo的动画结束后,开始播放底部注册、登录按钮的动画
bottomAnim.start();
}
});
}
/**
* 重写返回键,实现双击退出效果
*/
// @Override
// public boolean onKeyDown(int keyCode, KeyEvent event) {
// if (keyCode == KeyEvent.KEYCODE_BACK) {
// if (System.currentTimeMillis() - exitTime > 2000) {
Toast.makeText(LoginMainActivity.this, "再按一次退出程序", Toast.LENGTH_SHORT).show();
// exitTime = System.currentTimeMillis();
// } else {
LoginMainActivity.this.finish();
// }
// return true;
// }
// return super.onKeyDown(keyCode, event);
// }
}
3.布局和属性:
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/white"
tools:context=".ui.activity.sgf.guide.SgfSplash2Activity">
android:id="@+id/tv_login"
android:layout_width="250dp"
android:layout_height="45dp"
android:layout_above="@+id/tv_register"
android:layout_centerHorizontal="true"
android:layout_marginBottom="23dp"
android:alpha="0"
android:background="@drawable/shape_gradient"
android:gravity="center"
android:text="登录"
android:textColor="@color/white"
android:textSize="15sp" />
android:id="@+id/tv_register"
android:layout_width="250dp"
android:layout_height="45dp"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:layout_marginBottom="102dp"
android:alpha="0"
android:background="@drawable/shape_gradient"
android:gravity="center"
android:text="新用户注册"
android:textColor="@color/white"
android:textSize="15sp" />
android:id="@+id/iv_logo"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:src="@drawable/ic_launcher" />
渐变背景色:
android:angle="180"
android:endColor="#387cfd"
android:startColor="#26c4fd"
android:type="linear" />
android:name=".ui.activity.sgf.guide.SgfSplash2Activity"
android:configChanges="orientation|screenSize|keyboardHidden"
android:screenOrientation="portrait" />
android:name=".ui.activity.sgf.guide.SgfSplash3Activity"
android:theme="@style/AppTheme.Launcher"
android:configChanges="orientation|screenSize|keyboardHidden"
android:screenOrientation="portrait" />
style
@drawable/layer_launcher
true
true
layer_launcher.xml
android:gravity="center"
android:src="@drawable/wallpaper_11" />
4.在这个案例中有对启动页黑屏或白屏的简单处理:
解决方法:
a.禁用Preview Window(不建议使用):
既然APP启动时的黑白屏是由Preview引起的,那系统有没有提供禁用的方法呢? 答案是肯定的。黑白屏的问题是解决了,但点击应用图标后会有一段时间没有响应。用户体验不好,违背了优化的初衷。修改上述style 如下:
true
true
true
b.使用透明主题(不建议使用)
true
true
true
特点:应用启动慢,刷新同步,界面会一次性刷新出来。由于背景透明,初始化的过程中,用户看到的是桌面,有种错觉
c.修改windowBackground属性(建议使用此方法)
@drawable/layer_launcher
true
true
自定义layer-list: layer_launcher.xml 代码如下:
android:gravity="center"
android:src="@drawable/launch_logo" />
特点:应用启动快,非同步刷新,界面会先显示背景图,然后再刷新其他控件,个人比较推荐。
将第一个启动的activity的布局setContentView(R.layout.activity_xxx); 去掉;
Android 启动页过渡动画效果实现(一)
*推荐一个极品美图网站:
最后
以上就是花痴草莓为你收集整理的android 启动活动 动画,Android 启动页过渡动画效果实现(一)的全部内容,希望文章能够帮你解决android 启动活动 动画,Android 启动页过渡动画效果实现(一)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复