스플래시 화면을 만들려면 어떻게 해야 합니까?
저는 제 앱이 좀 더 전문적으로 보이기를 원해서 스플래시 화면을 추가하기로 결정했습니다.
구현을 어떻게 진행해야 합니까?
이 솔루션을 사용하면 사용자가 더 이상 기다릴 수 없습니다. 시작 화면의 지연은 응용 프로그램의 시작 시간에 따라 달라집니다.
안드로이드 앱을 열면 위에 앱의 제목과 아이콘이 있는 검은색 화면이 기본적으로 나타납니다. 스타일/테마를 사용하여 변경할 수 있습니다.
먼저 values 폴더에 style.xml을 만들고 여기에 스타일을 추가합니다.
<style name="splashScreenTheme" parent="@android:style/Theme.DeviceDefault.Light.NoActionBar">
<item name="android:windowBackground">@drawable/splash_screen</item>
</style>
사하는대를 사용하는 에.@android:style/Theme.DeviceDefault.Light.NoActionBar다른 테마를 부모로 사용할 수 있습니다.
두앱 Manifest에서 "Manifest.xml"을 합니다.android:theme="@style/splashScreenTheme"당신의 주요 활동에.
<activity
android:name="MainActivity"
android:label="@string/app_name"
android:theme="@style/splashScreenTheme" >
셋째, onCreate() 시작 활동에서 테마를 업데이트합니다.
protected void onCreate(Bundle savedInstanceState) {
// Make sure this is before calling super.onCreate
setTheme(R.style.mainAppTheme);
super.onCreate(savedInstanceState);
}
@mat1h와 @adelriosantiago 덕분입니다.
자세한 내용:
이전 답변:
방법: 간단한 시작 화면
이 답변은 브랜드화 등의 이유로 앱이 시작될 때 일정 시간 동안 시작 화면을 표시하는 방법을 보여줍니다.예를 들어 시작 화면을 3초 동안 표시하도록 선택할 수 있습니다.그러나 다양한 시간(예: 앱 시작 시간) 동안 스플래시 화면을 표시하려면 압둘라의 답변 https://stackoverflow.com/a/15832037/401025 을 확인해야 합니다.그러나 앱 시작이 새 장치에서 매우 빠를 수 있으므로 사용자는 불량 UX인 플래시만 볼 수 있습니다.
먼플시화정합야니다해의면에서 .layout.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">
<ImageView android:id="@+id/splashscreen" android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:src="@drawable/splash"
android:layout_gravity="center"/>
<TextView android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Hello World, splash"/>
</LinearLayout>
그리고 당신의 활동은:
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
public class Splash extends Activity {
/** Duration of wait **/
private final int SPLASH_DISPLAY_LENGTH = 1000;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
setContentView(R.layout.splashscreen);
/* New Handler to start the Menu-Activity
* and close this Splash-Screen after some seconds.*/
new Handler().postDelayed(new Runnable(){
@Override
public void run() {
/* Create an Intent that will start the Menu-Activity. */
Intent mainIntent = new Intent(Splash.this,Menu.class);
Splash.this.startActivity(mainIntent);
Splash.this.finish();
}
}, SPLASH_DISPLAY_LENGTH);
}
}
이상입니다 ;)
- 활동 만들기: 시작
- 레이아웃 XML 파일 생성: splash.xml
- 원하는 대로 보이도록 UI 구성 요소를 splash.xml 레이아웃에 배치합니다.
당신의 스플래시.java는 다음과 같이 보일 수 있습니다.
public class Splash extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.splash); int secondsDelayed = 1; new Handler().postDelayed(new Runnable() { public void run() { startActivity(new Intent(Splash.this, ActivityB.class)); finish(); } }, secondsDelayed * 1000); } }ActivityB.class화면 후 합니다.매니페스트 파일을 확인하면 다음과 같아야 합니다.
<activity android:name=".HomeScreen" android:label="@string/app_name"> </activity> <activity android:name=".Splash" android:label="@string/title_activity_splash_screen"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity>
위의 답변들은 매우 좋지만, 저는 다른 것을 추가하고 싶습니다.저는 안드로이드가 처음이라 개발 중에 이런 문제를 겪었습니다.이것이 나 같은 사람을 도울 수 있기를 바랍니다.
스플래시 화면은 내 앱의 진입점이므로 AndroidManifest.xml에 다음 행을 추가합니다.
<activity android:name=".SplashActivity" android:theme="@android:style/Theme.DeviceDefault.Light.NoActionBar"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity>스플래시 화면은 앱 수명 주기에서 한 번만 표시되어야 하며, 저는 부울 변수를 사용하여 스플래시 화면의 상태를 기록하고 처음에만 표시합니다.
public class SplashActivity extends Activity { private static boolean splashLoaded = false; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (!splashLoaded) { setContentView(R.layout.activity_splash); int secondsDelayed = 1; new Handler().postDelayed(new Runnable() { public void run() { startActivity(new Intent(SplashActivity.this, MainActivity.class)); finish(); } }, secondsDelayed * 500); splashLoaded = true; } else { Intent goToMainActivity = new Intent(SplashActivity.this, MainActivity.class); goToMainActivity.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); startActivity(goToMainActivity); finish(); } } }
해피 코딩!
압둘라의 대답은 훌륭합니다.하지만 저는 제 답변과 함께 그것에 더 많은 세부사항을 추가하고 싶습니다.
시작 화면 구현
스플래시 화면을 올바르게 구현하는 것은 여러분이 상상하는 것과 조금 다릅니다.시작 작업에서 레이아웃 파일을 부풀리기 전에 표시되는 시작 보기가 즉시 준비되어야 합니다.
따라서 레이아웃 파일을 사용하지 않습니다.대신 시작 화면의 배경을 활동의 테마 배경으로 지정합니다.이렇게 하려면 먼저 res/drawable로 XML 그리기를 만듭니다.
background_background.xml
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<!-- Background Color -->
<item
android:drawable="@color/gray"/>
<!-- Logo -->
<item>
<bitmap
android:gravity="center"
android:src="@mipmap/ic_launcher"/>
</item>
</layer-list>
그것은 단지 중앙 배경색의 로고가 있는 레이어 리스트입니다.
이제 styles.xml을 열고 이 스타일을 추가합니다.
<style name="SplashTheme" parent="Theme.AppCompat.NoActionBar">
<item name="android:windowBackground">@drawable/background_splash</item>
</style>
이 테마에는 위에서 방금 만든 배경과 수행 표시줄이 없습니다.
그리고 매니페스트에서는 스플래시 테마를 스플래시로 사용할 활동으로 설정해야 합니다.
<activity
android:name=".SplashActivity"
android:theme="@style/SplashTheme">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
그런 다음 활동 코드 내부에서 의도를 사용하여 스플래시한 후 사용자를 특정 화면으로 이동합니다.
public class SplashActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Intent intent = new Intent(this, MainActivity.class);
startActivity(intent);
finish();
}
}
그것이 올바른 방법입니다.저는 답변을 위해 이 참고 자료들을 사용했습니다.
- https://material.google.com/patterns/launch-screens.html
- https://www.bignerdranch.com/blog/splash-screens-the-right-way/ 저를 올바른 방향으로 이끌어주신 이 분들께 감사드립니다.승인된 답변은 시작 화면을 권장하지 않기 때문에 다른 사람을 돕고 싶습니다.
다음을 작성합니다.
ActivitySplashScreen.javapublic class SplashScreen extends Activity { protected boolean _active = true; protected int _splashTime = 3000; // time to display the splash screen in ms @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.splashscreen); Thread splashTread = new Thread() { @Override public void run() { try { int waited = 0; while (_active && (waited < _splashTime)) { sleep(100); if (_active) { waited += 100; } } } catch (Exception e) { } finally { startActivity(new Intent(SplashScreen.this, MainActivity.class)); finish(); } }; }; splashTread.start(); } }splashscreen.xml될 거예요.<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="600px" android:layout_height="1024px" android:background="#FF0000"> </RelativeLayout>
기본적으로 스플래시 스크렌은 자동으로 응용프로그램을 보다 전문적으로 보이게 하지 않습니다.전문적으로 설계된 스플래시 화면은 프로그램을 보다 전문적으로 보이게 만들 수 있지만, 프로그램을 작성하는 방법을 모르면 나머지 프로그램이 실제로 얼마나 전문적인지 알 수 있습니다.
스플래시 화면이 표시되는 유일한 이유는 프로그램이 시작되기 전에 해당 화면에 의존하기 때문에 대량의 계산을 수행 중이거나 GPS/WiFi가 시작되기를 기다리고 있기 때문입니다.이러한 계산 결과나 GPS/WiFi(등)에 액세스하지 않으면 응용 프로그램이 물에 잠겨 스플래시 화면이 필요하다고 느껴지므로 실행 중인 다른 프로그램(배경 포함)에 대한 화면 보기를 차단해야 합니다.
이러한 스플래시 화면은 이미 초기화된 느낌을 주기 위해 전체 화면 응용 프로그램처럼 보여야 하며, 긴 계산이 완료된 후 최종 세부 정보를 입력할 수 있습니다(이미지 수정).그것이 사실이거나 프로그램이 설계될 수 있는 유일한 방법일 가능성은 매우 작습니다.
사용자(및 나머지 OS)가 기다리는 동안 프로그램이 시간이 좀 걸릴 것(대기 기간이 불확실한 경우)에 따라 달라지도록 설계하기보다는 다른 작업을 수행할 수 있도록 허용하는 것이 좋습니다.
이미 전화기에 GPS/WiFi가 시작되고 있다는 아이콘이 있습니다.시작 화면이 차지하는 시간 또는 공간은 사전 계산을 로드하거나 실제로 계산을 수행하는 데 사용될 수 있습니다.사용자가 발생시키는 문제와 고려해야 할 사항은 아래의 첫 번째 링크를 참조하십시오.
이러한 계산 또는 GPS/WiFi를 기다려야 하는 경우에는 애플리케이션을 시작하고 계산을 기다려야 한다는 팝업을 표시하는 것이 좋습니다(텍스트 "초기화" 메시지는 괜찮습니다).GPS/WiFi 대기 시간이 예상되므로(다른 프로그램에서 활성화되지 않은 경우) 대기 시간을 알릴 필요가 없습니다.
시작 화면에서 프로그램이 실제로 이미 실행되고 있을 때 프로그램 사용을 지연시키고 CPU/GPU를 독차지하여 대부분의 사용자가 필요하다고 느끼지 않는 작업을 수행하는 것입니다.
프로그램을 시작할 때마다 스플래시 화면을 보는 것이 좋습니다. 그렇지 않으면 전문적으로 작성된 것 같지 않습니다.시작 화면을 전체 화면으로 만들고 실제 프로그램의 화면을 복제하면(사실 초기화되지 않았을 때 초기화된다고 생각합니다) 프로그램을 보다 전문적으로 보이게 하는 목표를 달성할 수 있지만, 저는 그렇게 확신하지 않습니다.
하지 않는 이유: http://cyrilmottier.com/2012/05/03/splash-screens-are-evil-dont-use-them/
방법: https://encrypted.google.com/search?q=Android+splash+screen+source
따라서 그렇게 하지 않을 충분한 이유가 있지만 어떻게든 당신의 상황이 그러한 예에서 벗어난다고 확신한다면 그것을 할 수 있는 방법은 위에 제시되어 있습니다.응용프로그램을 보다 전문적으로 보이게 하거나 사용자가 이 작업을 수행한 유일한 이유를 설명하지 못하도록 해야 합니다.
모든 비디오를 긴 그래픽 인트로(및 아웃로)로 시작하거나 농담을 하거나 지난 주에 있었던 일을 설명해야 할 필요성을 느끼는 유튜브 채널과 같습니다(코미디 또는 라이프스타일 채널이 아닐 때).그냥 쇼를 보여주세요! (그냥 프로그램을 실행하세요.)
무엇보다도 대답이 정말 좋습니다.하지만 메모리 누수 문제가 있습니다.이 문제는 종종 Android 커뮤니티에서 "Leaking an Activity"로 알려져 있습니다.그게 정확히 무슨 뜻일까요?
방향 변경과 같은 구성 변경이 발생하면 Android는 활동을 삭제하고 다시 만듭니다.일반적으로 가비지 수집기는 이전 활동 인스턴스의 할당된 메모리를 삭제하기만 하면 됩니다.
"Leaking an Activity"는 가비지 수집기가 이전 Activity 인스턴스의 할당된 메모리를 지울 수 없는 상황을 의미합니다.being (strong) referenced활동 인스턴스보다 오래된 개체에서.모든 Android 앱에는 특정 메모리 양이 할당되어 있습니다.하지 않는 메모리를 할 수 때 Garbage Collector와 합니다.OutOfMemorymessage
앱의 메모리 누수 여부를 어떻게 판단합니까?가장 빠른 방법은 Android Studio에서 메모리 탭을 열고 방향을 변경할 때 할당된 메모리에 주의를 기울이는 것입니다.할당된 메모리가 계속 증가하고 결코 감소하지 않으면 메모리 누수가 발생합니다.
1.사용자가 방향을 변경할 때 메모리 누수가 발생합니다.
에서 시작 화면을 .splashscreen.xml
시작 화면 활동에 대한 샘플 코드입니다.
public class Splash extends Activity {
// 1. Create a static nested class that extends Runnable to start the main Activity
private static class StartMainActivityRunnable implements Runnable {
// 2. Make sure we keep the source Activity as a WeakReference (more on that later)
private WeakReference mActivity;
private StartMainActivityRunnable(Activity activity) {
mActivity = new WeakReference(activity);
}
@Override
public void run() {
// 3. Check that the reference is valid and execute the code
if (mActivity.get() != null) {
Activity activity = mActivity.get();
Intent mainIntent = new Intent(activity, MainActivity.class);
activity.startActivity(mainIntent);
activity.finish();
}
}
}
/** Duration of wait **/
private final int SPLASH_DISPLAY_LENGTH = 1000;
// 4. Declare the Handler as a member variable
private Handler mHandler = new Handler();
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(icicle);
setContentView(R.layout.splashscreen);
// 5. Pass a new instance of StartMainActivityRunnable with reference to 'this'.
mHandler.postDelayed(new StartMainActivityRunnable(this), SPLASH_DISPLAY_LENGTH);
}
// 6. Override onDestroy()
@Override
public void onDestroy() {
// 7. Remove any delayed Runnable(s) and prevent them from executing.
mHandler.removeCallbacksAndMessages(null);
// 8. Eagerly clear mHandler allocated memory
mHandler = null;
}
}
자세한 내용은 이 링크를 참조하십시오.
여기 전체 코드입니다.
활동 시작.java
public class SplashActivity extends AppCompatActivity {
private final int SPLASH_DISPLAY_DURATION = 1000;
@Override
public void onCreate(Bundle bundle) {
super.onCreate(bundle);
new Handler().postDelayed(new Runnable(){
@Override
public void run() {
Intent mainIntent = new Intent(SplashActivity.this,MainActivity.class);
SplashActivity.this.startActivity(mainIntent);
SplashActivity.this.finish();
}
}, SPLASH_DISPLAY_DURATION);
}}
드로잉에서 이 bg_splash.xml을 생성합니다.
<?xml version="1.0" encoding="utf-8"?><layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:drawable="@color/app_color"/>
<item>
<bitmap
android:gravity="center"
android:src="@drawable/ic_in_app_logo_big"/>
</item></layer-list>
styles.xml에서 사용자 지정 테마 생성
<style name="SplashTheme" parent="Theme.AppCompat.NoActionBar">
<item name="android:windowBackground">@drawable/bg_splash</item>
</style>
AndroidManifest.xml에서 활동 테마를 지정합니다.
<activity
android:name=".activities.SplashActivity"
android:label="@string/app_name"
android:screenOrientation="portrait"
android:theme="@style/SplashTheme">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
건배.
레이아웃 파일에서 시작 화면을 로드하면 안 됩니다. 로드할 때 약간의 지연이 있을 수 있습니다.
가장 좋은 방법은 스플래시 화면 활동에 대한 테마를 만들고 설정하는 것입니다.the android:windowBackground인출 가능한 리소스로.
https://www.bignerdranch.com/blog/splash-screens-the-right-way/
간단히 말해서,
매니페스트에서 SplunkScreen 활동을 선언합니다.
<activity
android:name=".activities.SplashScreenActivity"
android:theme="@style/SplashTheme"
android:screenOrientation="portrait">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
SplunkScreen Activity.java에서 다음 작업을 수행합니다.
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Intent intent = new Intent(this, MainActivity_.class);
startActivity(intent);
finish();
}
그런 다음 테마의 배경 창에 대한 리소스를 만듭니다.
<style name="SplashTheme" parent="Theme.Bumpfie.Base">
<item name="android:windowBackground">@drawable/splash</item>
</style>
그리기 가능한 파일 splash.xml:
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@android:color/white"/>
<item>
<bitmap
android:gravity="center"
android:src="@drawable/app_logo"/>
</item>
</layer-list>
Android Mashmallow 이후로, 제가 생각하게 된 스플래시 화면의 다른 생산적인 사용은 당신의 앱의 스플래시 화면에서 필요하다고 요청하는 것입니다.
대부분의 앱이 이런 방식으로 권한 요청을 처리하는 것 같습니다.
대화상자는 나쁜 UIX를 만들고 메인 흐름을 깨고 실행 시간을 결정하게 하며 대부분의 사용자들은 당신의 앱이 SD 카드에 무언가를 쓰기를 원하는지조차 신경 쓰지 않을 수 있습니다.그들 중 일부는 우리가 알기 쉬운 영어로 번역하기 전까지 우리가 전달하려는 것을 이해하지 못할 수도 있습니다.
한 번에 권한을 요청하면 모든 작업 전에 "만약 그렇지 않다면"의 수가 줄어들고 코드가 혼란스러워 보입니다.
다음은 Android OS 23+를 실행하는 장치에 대한 부팅 작업에서 권한을 요청하는 방법의 예입니다.
모든 권한이 부여되었거나 이미 부여되었거나 앱이 Pre Mashmallow에서 실행 중인 경우 0.5초의 지연 없이 주요 콘텐츠를 표시하여 사용자가 이 질문을 읽고 최선을 다하기 위해 노력한 노력을 감상할 수 있습니다.
import android.Manifest;
import android.annotation.TargetApi;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.support.v7.app.AppCompatActivity;
import android.widget.Toast;
import com.c2h5oh.beer.R;
import com.c2h5oh.beer.utils.Animatrix;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class SplashActivity extends AppCompatActivity {
final private int REQUEST_CODE_ASK_MULTIPLE_PERMISSIONS = 124;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.splash);
//show animations
Animatrix.scale(findViewById(R.id.title_play), 100);
Animatrix.scale(findViewById(R.id.title_edit), 100);
Animatrix.scale(findViewById(R.id.title_record), 100);
Animatrix.scale(findViewById(R.id.title_share), 100);
if (Build.VERSION.SDK_INT >= 23) {
// Marshmallow+ Permission APIs
fuckMarshMallow();
} else {
// Pre-Marshmallow
///Display main contents
displaySplashScreen();
}
}
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
switch (requestCode) {
case REQUEST_CODE_ASK_MULTIPLE_PERMISSIONS: {
Map<String, Integer> perms = new HashMap<String, Integer>();
// Initial
perms.put(Manifest.permission.READ_EXTERNAL_STORAGE, PackageManager.PERMISSION_GRANTED);
perms.put(Manifest.permission.RECORD_AUDIO, PackageManager.PERMISSION_GRANTED);
perms.put(Manifest.permission.MODIFY_AUDIO_SETTINGS, PackageManager.PERMISSION_GRANTED);
perms.put(Manifest.permission.VIBRATE, PackageManager.PERMISSION_GRANTED);
// Fill with results
for (int i = 0; i < permissions.length; i++)
perms.put(permissions[i], grantResults[i]);
// Check for ACCESS_FINE_LOCATION
if (perms.get(Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED
&& perms.get(Manifest.permission.RECORD_AUDIO) == PackageManager.PERMISSION_GRANTED
&& perms.get(Manifest.permission.MODIFY_AUDIO_SETTINGS) == PackageManager.PERMISSION_GRANTED
&& perms.get(Manifest.permission.VIBRATE) == PackageManager.PERMISSION_GRANTED) {
// All Permissions Granted
// Permission Denied
Toast.makeText(SplashActivity.this, "All Permission GRANTED !! Thank You :)", Toast.LENGTH_SHORT)
.show();
displaySplashScreen();
} else {
// Permission Denied
Toast.makeText(SplashActivity.this, "One or More Permissions are DENIED Exiting App :(", Toast.LENGTH_SHORT)
.show();
finish();
}
}
break;
default:
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
}
}
@TargetApi(Build.VERSION_CODES.M)
private void fuckMarshMallow() {
List<String> permissionsNeeded = new ArrayList<String>();
final List<String> permissionsList = new ArrayList<String>();
if (!addPermission(permissionsList, Manifest.permission.READ_EXTERNAL_STORAGE))
permissionsNeeded.add("Read SD Card");
if (!addPermission(permissionsList, Manifest.permission.RECORD_AUDIO))
permissionsNeeded.add("Record Audio");
if (!addPermission(permissionsList, Manifest.permission.MODIFY_AUDIO_SETTINGS))
permissionsNeeded.add("Equilizer");
if (!addPermission(permissionsList, Manifest.permission.VIBRATE))
permissionsNeeded.add("Vibrate");
if (permissionsList.size() > 0) {
if (permissionsNeeded.size() > 0) {
// Need Rationale
String message = "App need access to " + permissionsNeeded.get(0);
for (int i = 1; i < permissionsNeeded.size(); i++)
message = message + ", " + permissionsNeeded.get(i);
showMessageOKCancel(message,
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
requestPermissions(permissionsList.toArray(new String[permissionsList.size()]),
REQUEST_CODE_ASK_MULTIPLE_PERMISSIONS);
}
});
return;
}
requestPermissions(permissionsList.toArray(new String[permissionsList.size()]),
REQUEST_CODE_ASK_MULTIPLE_PERMISSIONS);
return;
}
Toast.makeText(SplashActivity.this, "No new Permission Required- Launching App .You are Awesome!!", Toast.LENGTH_SHORT)
.show();
displaySplashScreen();
}
private void showMessageOKCancel(String message, DialogInterface.OnClickListener okListener) {
new AlertDialog.Builder(SplashActivity.this)
.setMessage(message)
.setPositiveButton("OK", okListener)
.setNegativeButton("Cancel", null)
.create()
.show();
}
@TargetApi(Build.VERSION_CODES.M)
private boolean addPermission(List<String> permissionsList, String permission) {
if (checkSelfPermission(permission) != PackageManager.PERMISSION_GRANTED) {
permissionsList.add(permission);
// Check for Rationale Option
if (!shouldShowRequestPermissionRationale(permission))
return false;
}
return true;
}
/**
* Display main content with little delay just so that user can see
* efforts I put to make this page
*/
private void displaySplashScreen() {
new Handler().postDelayed(new Runnable() {
/*
* Showing splash screen with a timer. This will be useful when you
* want to show case your app logo / company
*/
@Override
public void run() {
startActivity(new Intent(SplashActivity.this, AudioPlayerActivity.class));
finish();
}
}, 500);
}
}
public class MainActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Thread t=new Thread()
{
public void run()
{
try {
sleep(2000);
finish();
Intent cv=new Intent(MainActivity.this,HomeScreen.class/*otherclass*/);
startActivity(cv);
}
catch (InterruptedException e) {
e.printStackTrace();
}
}
};
t.start();
}
활동을 만들고 'A'라는 이름의 활동을 만든 다음 시작 화면 이미지를 배경으로 설정하는 myscreen.xml이라는 xml 파일을 만든 다음 카운트다운 타이머를 사용하여 한 활동에서 다른 활동으로 이동합니다.카운트다운 타이머를 사용하는 방법은 Android에서 이 질문의 TimerTask에 나와 있는 답변을 참조하십시오.
예 " 작화예면시":
public class MainActivity extends Activity {
private ImageView splashImageView;
boolean splashloading = false;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
splashImageView = new ImageView(this);
splashImageView.setScaleType(ScaleType.FIT_XY);
splashImageView.setImageResource(R.drawable.ic_launcher);
setContentView(splashImageView);
splashloading = true;
Handler h = new Handler();
h.postDelayed(new Runnable() {
public void run() {
splashloading = false;
setContentView(R.layout.activity_main);
}
}, 3000);
}
}
시작 화면은 Android에서 사용할 수 없는 약간의 객체입니다. 주 작업 시작 지연을 숨기기 위해 가능한 한 빨리 로드할 수 없습니다.그것을 사용하는 두 가지 이유가 있습니다: 광고와 네트워크 운영.
대화상자로 구현하면 스플래시 화면에서 활동의 기본 UI로 지체 없이 이동할 수 있습니다.
public class SplashDialog extends Dialog {
ImageView splashscreen;
SplashLoader loader;
int splashTime = 4000;
public SplashDialog(Context context, int theme) {
super(context, theme);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_splash);
setCancelable(false);
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
cancel();
}
}, splashTime);
}
}
레이아웃:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@color/white">
<ImageView
android:id="@+id/splashscreen"
android:layout_width="190dp"
android:layout_height="190dp"
android:background="@drawable/whistle"
android:layout_centerInParent="true" />
</RelativeLayout>
시작:
public class MyActivity extends ActionBarActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (getIntent().getCategories() != null && getIntent().getCategories().contains("android.intent.category.LAUNCHER")) {
showSplashScreen();
}
}
protected Dialog splashDialog;
protected void showSplashScreen() {
splashDialog = new SplashDialog(this, R.style.SplashScreen);
splashDialog.show();
}
...
}
CountDownTimer를 사용하여 다른 접근 방식을 수행할 수 있습니다.
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.splashscreen);
new CountDownTimer(5000, 1000) { //5 seconds
public void onTick(long millisUntilFinished) {
mTextField.setText("seconds remaining: " + millisUntilFinished / 1000);
}
public void onFinish() {
startActivity(new Intent(SplashActivity.this, MainActivity.class));
finish();
}
}.start();
}
가 가끔사열때가를 .SplashActivity그리고 즉시 종료했지만 앱은 여전히 다음으로 이동합니다.MainActivity나고끝 SPLASH_SCREEN_DISPLAY_LENGTH.
예방을 위해:인SplashActivity은 당은확야합다를 .SplashActivity다음으로 이동하기 전에 완료 여부MainActivity
public class SplashActivity extends Activity {
private final int SPLASH_SCREEN_DISPLAY_LENGTH = 2000;
@Override
public void onCreate(Bundle icicle) {
...
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
if (!isFinishing()) {//isFinishing(): If the activity is finishing, returns true; else returns false.
startActivity(new Intent(SplashActivity.this, MainActivity.class));
finish();
}
}, SPLASH_SCREEN_DISPLAY_LENGTH);
}
}
}
이것이 도움이 되길 바랍니다.
- Add in SplashActivity
public class SplashActivity extends Activity {
private ProgressBar progressBar;
int i=0;
Context context;
private GoogleApiClient googleApiClient;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_splash);
context = this;
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
startActivity(new Intent(Splash.this, LoginActivity.class));
finish();
}
}, 2000);
}
}
- Add in activity_splash.xml
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:custom="http://schemas.android.com/apk/res-auto"
android:background="@color/colorAccent"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".Splash">
<ImageView
android:id="@+id/ivLogo"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:src="@mipmap/icon_splash"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"/>
<ProgressBar
android:id="@+id/circle_progress"
style="?android:attr/progressBarStyleHorizontal"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_marginBottom="5dp"
android:max="100"
android:progressTint="@color/green"
android:visibility="visible" />
</RelativeLayout>
- Add in AndroidManifest.xml
<activity android:name="ex.com.SplashActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
정말 쉬운 & gr8 접근 방식:
먼저 다음 웹 사이트로 스플래시를 만듭니다.
https://www.norio.be/android-feature-graphic-generator/
로고와 슬로건을 선택하고 아름다운 배경을 선택합니다.크기를 4096x4096으로 조정합니다.
이제 해당 사진을 다운로드하여 다음 주소로 업로드합니다.
https://apetools.webprofusion.com/app/ #/도구/이미지 고릴라
그리고 필요한 모든 스플래시 화면, 모든 장치, 모든 플랫폼을 생성합니다.
맛있게 드세요!
여기에는 구현에 도움이 되는 충분한 답변이 있습니다.이 게시물은 스플래시 화면을 만드는 첫 단계에서 다른 사람들을 돕기 위한 것이었습니다!
코틀린에서 다음 코드를 작성합니다.
Handler().postDelayed({
val mainIntent = Intent(this@SplashActivity, LoginActivity::class.java)
startActivity(mainIntent)
finish()
}, 500)
이것이 당신에게 도움이 되기를 바랍니다.감사합니다......
코드를 변경할 필요가 없도록 AndroidManifest.xml에 정의된 동일한 코드를 사용할 수 있는 초유연한 실행 화면은 어떻습니까?저는 일반적으로 코드 라이브러리를 개발하고 코드를 사용자 정의하는 것을 좋아하지 않습니다. 왜냐하면 코드가 엉성하기 때문입니다.
<activity
android:name=".SplashActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<meta-data android:name="launch_class" android:value="com.mypackage.MyFirstActivity" />
<meta-data android:name="duration" android:value="5000" />
</activity>
그런 다음 Spash Activity 자체가 "launch_class"에 대한 메타데이터를 검색하여 Intent 자체를 만듭니다.메타데이터 "기간"은 시작 화면이 유지되는 시간을 정의합니다.
public class SplashActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
setContentView(R.layout.activity_splash);
ComponentName componentName = new ComponentName(this, this.getClass());
try {
Bundle bundle = null;
bundle = getPackageManager().getActivityInfo(componentName, PackageManager.GET_META_DATA).metaData;
String launch_class = bundle.getString("launch_class");
//default of 2 seconds, otherwise defined in manifest
int duration = bundle.getInt("duration", 2000);
if(launch_class != null) {
try {
final Class<?> c = Class.forName(launch_class);
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
Intent intent = new Intent(SplashActivity.this, c);
startActivity(intent);
finish();
}
}, duration);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
}
}
좋은 답변들이 있지만, 저는 구글이 추천하는 방법을 보여드리겠습니다.
처음에 다음 항목을 만듭니다.Theme: 화의경우면같: 과은테있습다니마가다시작음▁called▁theme라는 테마가 .splashscreenTheme런처 테마는 다음과 같습니다.
<style name="splashscreenTheme">
<item name="android:windowBackground">@drawable/launch_screen</item>
</style>
참고:
android:windowBackground 이미지 no 형식을 했습니다.
UI에서 이 작업을 다시 수행해야 합니다.
또한 여기서 드로잉 가능한 색상 대신 색상을 사용할 수 있습니다.
주제를 스플래시 화면 매니페스트로 설정 활동
<activity
android:name=".activity.splashscreenActivity"
android:screenOrientation="portrait"
android:theme="@style/splashscreenTheme">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
_screen을 하십시오.drawable에 .drawable이미지가 작지 않은 경우 폴더를 선택합니다.
그러면 실행 화면 시작 시간이 단축되고 검은색 화면에서 사용자를 보호할 수 있습니다.
또한 추가적인 초과 인출을 방지합니다.
이것은 내가 스플래시 화면에서 본 최고의 게시물입니다: http://saulmm.github.io/avoding-android-cold-starts
Saul Molinero는 스플래시 화면을 위한 두 가지 다른 옵션으로 전환됩니다.창 배경을 활용하여 초기 화면으로 애니메이션을 만들고 자리 표시자 UI(요즘 Google이 대부분의 앱에 사용하는 인기 있는 선택)를 표시합니다.
콜드 스타트 시간과 긴 시작 시간으로 인한 사용자 이탈 방지를 고려해야 할 때마다 이 게시물을 참조합니다.
이것이 도움이 되길 바랍니다!
이 경우 2초 동안만 이미지를 표시하기 위해 새 활동을 만들고 싶지 않았습니다.시작할 때MainAvtivity피카소를 사용하여 이미지를 홀더에 로드합니다. 로드하는 데 약 1초가 걸린다는 것을 알고 메인 액티비티 내에서 다음을 수행하기로 결정했습니다.OnCreate:
splashImage = (ImageView) findViewById(R.id.spllll);
this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);
int secondsDelayed = 1;
new Handler().postDelayed(new Runnable() {
public void run() {
getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
splashImage.setVisibility(View.GONE);
}
}, secondsDelayed * 2000);
애플리케이션을 시작할 때 가장 먼저 발생하는 것은ImageView창 플래그를 전체 화면으로 설정하여 상태Bar가 표시되고 제거됩니다.그다음에 제가.Handler2초 동안 실행하려면 2초 후에 전체 화면 플래그를 지우고 의 가시성을 설정합니다.ImageView로.GONE쉽고, 간단하며, 효과적입니다.
안드로이드에서는 정말 간단합니다. 우리는 단지 스플래시 화면을 구현하기 위해 핸들러 개념을 사용합니다.
이 코드를 SplunkScreen Activity java 파일에 붙여넣습니다.
SplunkScreen Activity xml 파일에 이미지 보기를 사용하여 사진을 넣습니다.
public void LoadScreen() {
final Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
Intent i = new Intent(SplashScreenActivity.this, AgilanbuGameOptionsActivity.class);
startActivity(i);
}
}, 2000);
}
onCreate 메서드에 추가할 수 있습니다.
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
// going to next activity
Intent i=new Intent(SplashScreenActivity.this,MainActivity.class);
startActivity(i);
finish();
}
},time);
원하는 대로 시간 값을 밀리초 단위로 초기화합니다.
private static int time=5000;
자세한 내용은 이 링크에서 전체 코드를 다운로드하십시오.
https://github.com/Mr-Perfectt/Splash-Screen
여기 간단한 것이 있습니다!
~루녹스
기본 활동.java
package com.example.splashscreen;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}
스플래시스크린.스플래시
package com.example.splashscreen;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
public class splashscreen extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.splashscreen);
//Splash Screen duration
int secondsDelayed = 1;
new Handler().postDelayed(new Runnable() {
public void run() {
startActivity(new Intent(splashscreen.this, MainActivity.class));
finish();
}
}, secondsDelayed * 3000);
}
}
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
splashscreen.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/splashlogo"
/>
스플래시 로고png
깃헙
한 가지 방법은 전체 화면 활동/공백 활동(예: 스플래시 화면 활동)을 만들어 앱을 열 때 나타나는 첫 번째 활동으로 설정하는 것입니다.의 활동에 다음을 추가합니다.AndroidManifest.xml
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
그런 다음 몇 초 후에 이 활동을 해제하도록 처리기를 설정할 수 있습니다.
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
Intent i= new Intent(SplashScreenActivity.this,MainActivity.class);
startActivity(i); //start new activity
finish();
}
}, 3000); //time in milliseconds
두 번째로, 별도의 활동을 만들고 싶지 않은 경우, 당신은 당신의 웹사이트 위에 레이아웃을 부풀릴 수 있습니다.MainActivity레이아웃 가시성을 몇 밀리초 후에 기존 스플래시 화면 레이아웃으로 설정하거나 기본 레이아웃을 확장합니다.
간단한 코드, 작동합니다:) 단순 스플래시
int secondsDelayed = 1;
new Handler().postDelayed(new Runnable() {
public void run() {
startActivity(new Intent(LoginSuccessFull.this, LoginActivity.class));
finish();
}
}, secondsDelayed * 1500);
public class SplashActivity extends Activity {
Context ctx;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ctx = this;
setContentView(R.layout.activity_splash);
Thread thread = new Thread(){
public void run(){
try {
sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
Intent in = new Intent(ctx,MainActivity.class);
startActivity(in);
finish();
}
};
thread.start();
}
}
언급URL : https://stackoverflow.com/questions/5486789/how-do-i-make-a-splash-screen
'programing' 카테고리의 다른 글
| jQuery는 요소에 속성이 있는지 확인하기 위해 특성을 가지고 있습니다. (0) | 2023.06.03 |
|---|---|
| Ruby 정규식의 \A \z와 ^ $ 간의 차이 (0) | 2023.06.03 |
| Passing variables in remote ssh command (0) | 2023.06.03 |
| psql을 사용하여 데이터베이스에 설치된 확장을 어떻게 나열합니까? (0) | 2023.06.03 |
| 루비 수면? 아니면 1초 미만의 지연? (0) | 2023.06.03 |