說明
Android的啓動界面以及初次運行界面的自定義實際沒有很多的技術含量,只不過是Android的activity的變樣的使用,是的應用具有一種說明性質的啓動界面,當然,也可以在相應的啓動界面中植入廣告。
要進行定義初次運行界面以及定義啓動界面的時候就是需要先將初次運行界面定義完成,然後定義啓動界面,將啓動界面設置爲應用運行首次加載的界面,然後在啓動界面裏通過判斷應用是否是初次運行來設置是否運行初次運行界面
初次運行界面
初次運行界面我這裏是通過FragmentActivity來實現的,因爲要加載多張初次運行的界面,所以使用FragmentActivity來實現多個界面的集成。
首先自定義Fragment,很簡單這裏就不多說,直接上代碼
需要注意的地方就是需要對所加載的界面進行拉伸處理,因爲畢竟是項目的初次運行,所以要保證美觀嘛
public class FirstRunFragment extends Fragment {
private int img_id;
private String text;
private View.OnClickListener listener;
public FirstRunFragment() {
}
@SuppressLint("ValidFragment")
public FirstRunFragment(int img_id) {
this.img_id = img_id;
this.text = null;
}
@SuppressLint("ValidFragment")
public FirstRunFragment(int img_id, View.OnClickListener listener) {
this.img_id = img_id;
this.listener = listener;
this.text = null;
}
@SuppressLint("ValidFragment")
public FirstRunFragment(String text) {// ////後期可刪除
this.text = text;
}
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
if (text != null) {
TextView view = new TextView(getActivity());
view.setLayoutParams(new ViewGroup.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.MATCH_PARENT));
view.setGravity(Gravity.CENTER);
view.setTextSize(40);
view.setText(text);
return view;
}
ImageView view = new ImageView(getActivity());
view.setLayoutParams(new ViewGroup.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.MATCH_PARENT));
if (img_id != 0)
view.setBackgroundResource(img_id);// 自動拉伸
else
view.setBackgroundColor(Color.WHITE);
if (listener != null)
view.setOnClickListener(listener);
// view.setImageResource(img_id);//是否考慮拉伸
return view;
}
}
在FragmentActivity裏集成Fragment,實現初次運行界面的展示,並且對運行完成之後的動作進行處理,也就是相應的跳轉到登錄界面等
public class FirstRun extends FragmentActivity {
private ViewPager viewpager;
private FragmentPagerAdapter adapter;
private List<Fragment> fragment_list = new ArrayList<Fragment>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.start_firstrun);
initView();
initListener();
}
private void initView() {
FirstRunFragment tab01 = new FirstRunFragment(R.drawable.bg_welcome_1);// //////介紹圖片
FirstRunFragment tab02 = new FirstRunFragment(R.drawable.bg_welcome_2);
FirstRunFragment tab03 = new FirstRunFragment(R.drawable.bg_welcome_3, new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(FirstRun.this, Login.class);
startActivity(intent);
finish();
}
});
FirstRunFragment tab04 = new FirstRunFragment(R.color.white);// 默認終止圖片(建議使用主界面截圖)
fragment_list.add(tab01);
fragment_list.add(tab02);
fragment_list.add(tab03);
fragment_list.add(tab04);
viewpager = (ViewPager) findViewById(R.id.firstrun_viewpager);
adapter = new FragmentPagerAdapter(getSupportFragmentManager()) {
public int getCount() {
return fragment_list.size();
}
public Fragment getItem(int arg0) {
return fragment_list.get(arg0);
}
};
viewpager.setAdapter(adapter);
viewpager.setCurrentItem(0);
}
public void initListener() {
viewpager.setOnPageChangeListener(new OnPageChangeListener() {
public void onPageSelected(int position) {
switch (position) {
case 3:
Intent intent = new Intent(FirstRun.this, Login.class);
startActivity(intent);
finish();
break;
}
}
public void onPageScrolled(int position, float positionOffset,
int positionOffsetPixels) {
}
public void onPageScrollStateChanged(int state) {
}
});
}
}
完成了界面的展示以及加載,接下來的就是需要在啓動界面裏進行相應的初次判斷來進行啓動了,具體實現在下面進行講述
啓動界面
啓動界面的設定其實是很簡單的,主要就是爲界面繪製一個佈局,然後加載相應的佈局,之後修改應用配置文件設置爲默認加載的界面。然後要定義一下界面結束的時間,從而實現界面結束時跳轉到其他的界面,如登錄界面等。
因爲我們還需要進行初次運行界面的設置,所以這裏還需要對應用的初次啓動狀態進行判斷
Android提供了SharedPreferences數據結構,可供我們存儲應用的使用狀態等
通過判斷我們就可以來決定是都加載初次運行界面了
歡迎界面的佈局文件
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<ImageView
android:id="@+id/welcome_img_0"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scaleType="centerCrop" />
<ImageView
android:id="@+id/welcome_img_1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scaleType="centerCrop" />
</FrameLayout>
由於我的項目集成了即時通訊、百度地圖等各種東西,所以在歡迎界面裏集成了很多的初始化操作,另外因爲需要與服務器的通訊,所以使用了自定義的網絡加載activity,大家自己測試的時候可以沒必要考慮這麼多
public class Welcome extends NetActivity {
@Bind(R.id.welcome_img_0)
ImageView img0;
@Bind(R.id.welcome_img_1)
ImageView img1;
private String name = "", pass = "";
private String msg = "";
private boolean need_close = false;
private int curr_index = 0;
private static final int[] imgs = {R.drawable.welcome_01, R.drawable.welcome_02,
R.drawable.welcome_03, R.drawable.welcome_04,
R.drawable.welcome_05, R.drawable.welcome_06,
R.drawable.welcome_07};
@Override
public void onCreate() {
this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
setContentView(R.layout.start_welcome);
ButterKnife.bind(this);
postRun();
/*
getMessage();
loadFirstImg();
startNewThread();
new Handler().postDelayed(new Runnable() {
public void run() {
postRun();
}
}, 1000);// 時間可以慢慢調整
*/
}
private void postRun() {
if (isSeriousError())
return;
initIP();
UserTool.setLoginState(Welcome.this, false);// 先保存爲未登錄狀態,然後在login中修改
if (!UserStateTool.isLoginEver(Welcome.this)) {
try {
LoginSampleHelper.getInstance().initIMKitTemp();
} catch (Exception e) {
}
}
updateTimestamp();
}
private void initIP() {
ServerURL.getIP();
}
private void loadFirstImg() {
need_close = false;
curr_index = (int) (Math.random() * imgs.length);
img1.setImageResource(imgs[curr_index]);
}
private void loadNextImage() {
int index = (int) (Math.random() * imgs.length);
while (index == curr_index) {
index = (int) (Math.random() * imgs.length);
}
curr_index = index;
img0.setImageResource(imgs[curr_index]);
//方式一通過代碼的方式定義透明度動畫
Animation alphaAnimation = new AlphaAnimation((float) 1, (float) 0);
alphaAnimation.setDuration(1000);//設置動畫持續時間爲3秒
alphaAnimation.setFillAfter(true);//設置動畫結束後保持當前的位置(即不返回到動畫開始前的位置)
img1.startAnimation(alphaAnimation);
}
private void prepareNextImg() {
img1.setImageResource(imgs[curr_index]);
}
private boolean isSeriousError() {
String value = ParamTool.getParam("serious_error");
if (value.equals("1")) {
Toast.makeText(this, "系統正在維護", Toast.LENGTH_SHORT).show();
Intent intent = new Intent(this, AboutMe.class);
startActivity(intent);
finish();
return true;
}
return false;
}
private void getMessage() {
msg = getIntent().getStringExtra("note_extra");
if (msg == null)
msg = "";
}
private void autoLogin() {
String[] user = UserTool.getUser(this);
name = user[0];
pass = user[1];
if (name.equals("") || pass.length() < 6) {// 未登錄過,或者是測試的
pass = "";
toLoginActivity();
return;
}
// 有登錄記錄,到login中自動登錄(減少重複代碼)
startLogin();
}
private void toLoginActivity() {
Intent intent = new Intent(this, Login.class);
startActivity(intent);
finish();
}
private void toMainActivity() {
//if (!msg.equals("")) {}
Intent intent = new Intent(this, MainMain.class);
startActivity(intent);
finish();
}
private void startLogin() {
ConnectEasy.POSTLOGIN(this, ServerURL.LOGIN, new ConnectListener() {
public ConnectDialog showDialog(ConnectDialog dialog) {
return null;
}
public ConnectList setParam(ConnectList list) {
list.put("appSecret", Login.APP_SECRET);
list.put("username", name);
list.put("password", pass);
return list;
}
public void onResponse(String response) {
loginBaiChuan(response); // 失敗等都在這裏面處理了
}
});
}
private void loginBaiChuan(String response) {
String pass = MsgTool.dealResponseGetPass(response, name);
String name = null;
try {
name = BaiChuanUtils.getUserName(Long.parseLong(InfoTool.getUserID(this)));
} catch (Exception e) {
return;
}
// 保存登錄狀態
UserTool.setLoginState(Welcome.this, true);// 保存爲登錄狀態
BaiChuanUtils.login(name, pass, null);//在後臺慢慢地登錄去吧
CacheTool.clearCache();//清空緩存
//等待3秒鐘,減少網絡佔用
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
AppUtil.dismissProgressDialog();
toMainActivity();
}
}, 3000);
// AppUtil.dismissProgressDialog();
// if (state) {
// toMainActivity();
// } else {
// BaiChuanUtils.showToast("登錄失敗");
// toLoginActivity();
// }
}
@Override
protected void onDestroy() {
need_close = true;
System.gc();
super.onDestroy();
}
@Override
public void receiveMessage(String what) {
if (what == null) {
loadNextImage();
} else {
prepareNextImg();
}
}
@Override
public void newThread() {
while (!need_close) {
try {
Thread.sleep(2000);
} catch (Exception e) {
}
sendMessage(null);
if (need_close)
return;
try {
Thread.sleep(900);
} catch (Exception e) {
}
sendMessage("");
}
}
private void updateTimestamp() {
StaticMethod.POST(this, ServerURL.TIME_STAMP, new ConnectListener() {
@Override
public ConnectList setParam(ConnectList list) {
return null;
}
@Override
public ConnectDialog showDialog(ConnectDialog dialog) {
return null;
}
@Override
public void onResponse(String response) {
ConnectSign.dealTimeSpace(response);//內部已處理
if (UserTool.isFirstRun(Welcome.this)) {
startActivity(new Intent(Welcome.this, FirstRun.class));
finish();
} else {
autoLogin();
}
}
});
}
}
在配置文件裏修改應用的默認啓動界面
<activity
android:name="com.chengmeng.start.welcome.Welcome"
android:label="@string/app_name"
android:screenOrientation="portrait">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.CREATE_SHORTCUT" />
</intent-filter>
</activity>
至此,便可以實現應用的初始運行界面與歡迎界面了,供大家參考。