[android] 롤리팝 : 투명하게 설정된 색상으로 statusBar 뒤에 그리기
테마에서 다음 줄만 사용하여 Lollipop에 대해 statusBar 색상을 투명으로 설정했습니다.
<item name="android:statusBarColor">@android:color/transparent</item>
이제 그 뒤에 그릴 필요가 있지만 그 뒤에는 어떤 견해도 가져올 수 없습니다. windowTranslucentStatus
속성으로 사용 하는 방법을 알고 있지만이 속성을 사용하지 않으려면 statusBar의 색상이 투명으로 설정되므로 무시하십시오.
답변
방법 # 1 :
완전히 투명한 상태 표시 줄을 얻으려면 statusBarColor
API 21 이상에서만 사용할 수 있는을 사용해야 합니다. windowTranslucentStatus
API 19 이상에서 사용할 수 있지만 상태 표시 줄에 색조 배경을 추가합니다. 그러나 설정 windowTranslucentStatus
은 statusBarColor
투명으로 변경 하지 않고 한 가지를 달성 합니다. SYSTEM_UI_FLAG_LAYOUT_STABLE
및 SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
플래그를 설정합니다 . 동일한 효과를 얻는 가장 쉬운 방법은 이러한 플래그를 수동으로 설정하는 것입니다.이 플래그는 Android 레이아웃 시스템에 의해 부과 된 삽입을 효과적으로 비활성화하고 사용자를 보호합니다.
onCreate
메소드 에서이 라인을 호출합니다 .
getWindow().getDecorView().setSystemUiVisibility(
View.SYSTEM_UI_FLAG_LAYOUT_STABLE
| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
/res/values-v21/styles.xml에서 투명도를 설정해야합니다.
<item name="android:statusBarColor">@android:color/transparent</item>
또는 프로그래밍 방식으로 투명도를 설정하십시오.
getWindow().setStatusBarColor(Color.TRANSPARENT);
이 접근 방식의 좋은 점은 색조가 지정된 반투명 상태 표시 줄의 투명 상태 표시 줄을 교환하여 동일한 레이아웃과 디자인을 API 19에서도 사용할 수 있다는 것입니다.
<item name="android:windowTranslucentStatus">true</item>
방법 # 2 :
상태 표시 줄 아래에보기를 배치하는 대신 배경 이미지 만 페인트해야하는 경우, 활동 테마의 배경을 원하는 이미지로 설정하고 방법 #에 표시된대로 상태 표시 줄 투명도를 설정하면됩니다. 1. 몇 달 전부터 Android Police 기사 의 스크린 샷을 만드는 데 사용한 방법 입니다.
방법 # 3 :
일부 레이아웃의 표준 시스템 삽입을 무시하고 다른 레이아웃에서 작동하도록 유지하려면 유일하게 실행 가능한 방법은 자주 연결된 ScrimInsetsFrameLayout
클래스 와 작업하는 것입니다 . 물론, 해당 수업에서 수행 된 일부 작업이 모든 시나리오에 필요한 것은 아닙니다. 예를 들어, 합성 상태 표시 줄 오버레이를 사용 init()
하지 않으 려면 메소드의 모든 내용을 주석 처리하고 attrs.xml 파일에 아무것도 추가하지 않아도됩니다. 이 접근 방식이 효과가있는 것을 보았지만이 방법을 사용하면 해결할 수있는 많은 작업이 필요할 수 있습니다.
또한 여러 레이아웃을 래핑하는 것에 반대하는 것을 보았습니다. 하나의 레이아웃을 다른 레이아웃 내부에 배치하는 경우 match_parent
높이와 너비 모두에 영향을 미치므로 성능에 대한 걱정은 너무 사소합니다. 어쨌든 확장 클래스 FrameLayout
를 원하는 다른 유형의 레이아웃 클래스 로 변경하여 이러한 상황을 완전히 피할 수 있습니다 . 잘 작동합니다.
답변
이것은 내 경우에 효과가 있었다
// Create/Set toolbar as actionbar
toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
// Check if the version of Android is Lollipop or higher
if (Build.VERSION.SDK_INT >= 21) {
// Set the status bar to dark-semi-transparentish
getWindow().setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS,
WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
// Set paddingTop of toolbar to height of status bar.
// Fixes statusbar covers toolbar issue
toolbar.setPadding(0, getStatusBarHeight(), 0, 0);
}
// A method to find height of the status bar
public int getStatusBarHeight() {
int result = 0;
int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android");
if (resourceId > 0) {
result = getResources().getDimensionPixelSize(resourceId);
}
return result;
}
statusBars 작업에 대한 자세한 내용 : youtube.com/watch?v=_mGDMVRO3iE
답변
이 테마를보십시오
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<!-- Customize your theme here. -->
<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>
<item name="colorPrimaryDark">@android:color/transparent</item>
<item name="colorPrimary">@color/md_blue_200</item>
<item name="android:windowDrawsSystemBarBackgrounds">true</item>
<item name="android:statusBarColor">@android:color/transparent</item>
<item name="android:windowTranslucentStatus">true</item>
</style>
레이아웃이 설정되어 있는지 확인하십시오
android:fitsSystemWindows="false"
답변
대신에
<item name="android:statusBarColor">@android:color/transparent</item>
다음을 사용하십시오.
<item name="android:windowTranslucentStatus">true</item>
‘MainActivity’레이아웃에서 상단 패딩 (기본적으로 추가됨)을 제거해야합니다.
이렇게해도 상태 표시 줄이 완전히 투명 해지지는 않으며 상태 표시 줄 위에 여전히 “흐리게 검은 색”오버레이가 표시됩니다.
답변
Cody Toombs의 솔루션은 거의 나를 위해 속임수를 사용했습니다. 이것이 Xamarin 과 관련 이 있는지 확실 하지 않지만 이제 수용 가능한 해결책이 있습니다.
이것은 내 설정입니다.
Android.Support v4 및 v7 패키지를 참조한 Android 프로젝트가 있습니다. 두 가지 스타일이 정의되어 있습니다.
values / styles.xml :
<?xml version="1.0" encoding="UTF-8" ?>
<resources>
<style name="MyStyle" parent="@style/Theme.AppCompat.Light.NoActionBar">
<item name="android:windowTranslucentStatus">true</item>
</style>
</resources>
values-v21 / styles.xml :
<?xml version="1.0" encoding="UTF-8" ?>
<resources>
<style name="MyStyle" parent="@style/Theme.AppCompat.Light.NoActionBar">
<item name="android:statusBarColor">@android:color/transparent</item>
</style>
</resources>
AndroidManifest는 “MyStyle”을 대상으로합니다.
AndroidManifest.xml :
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="1" android:versionName="1.0" package="com.agn.test.test">
<uses-sdk android:minSdkVersion="10" />
<application android:allowBackup="true" android:icon="@mipmap/icon" android:label="@string/app_name" android:theme="@style/MyStyle">
</application>
</manifest>
그리고 마지막으로 주요 활동의 코드 :
[Activity (Label = "Test", MainLauncher = true, Icon = "@mipmap/icon")]
public class MainActivity : Activity
{
protected override void OnCreate (Bundle savedInstanceState)
{
base.OnCreate (savedInstanceState);
SetContentView (Resource.Layout.Main);
//Resource.Layout.Main is just a regular layout, no additional flags. Make sure there is something in there like an imageView, so that you can see the overlay.
var uiOptions = (int)Window.DecorView.SystemUiVisibility;
uiOptions ^= (int)SystemUiFlags.LayoutStable;
uiOptions ^= (int)SystemUiFlags.LayoutFullscreen;
Window.DecorView.SystemUiVisibility = (StatusBarVisibility)uiOptions;
Window.AddFlags (WindowManagerFlags.DrawsSystemBarBackgrounds);
}
}
DrawsSystemBarBackgrounds 플래그를 설정하면 모든 차이가 발생합니다.
Window.AddFlags (WindowManagerFlags.DrawsSystemBarBackgrounds);
사실 너무 많은 시간을 제대로 보냈습니다. 이 답변이 같은 일을 달성하려는 사람에게 도움이 되길 바랍니다.
답변
@Cody Toombs의 답변으로 인해 탐색 모음 뒤에 레이아웃이 나타나는 문제가 발생합니다. 그래서 내가 찾은 것은 @Kriti가 제공 한이 솔루션을 사용 하는 것입니다.
Kotlin 코드 스 니펫은 다음과 같습니다.
if (Build.VERSION.SDK_INT >= 19 && Build.VERSION.SDK_INT < 21) {
setWindowFlag(this, WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS, true)
}
if (Build.VERSION.SDK_INT >= 19) {
window.decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_LAYOUT_STABLE or View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
}
if (Build.VERSION.SDK_INT >= 21) {
setWindowFlag(this, WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS, false)
getWindow().setStatusBarColor(Color.TRANSPARENT)
}
private fun setWindowFlag(activity: Activity, bits: Int, on: Boolean) {
val win: Window = activity.getWindow()
val winParams: WindowManager.LayoutParams = win.getAttributes()
if (on) {
winParams.flags = winParams.flags or bits
} else {
winParams.flags = winParams.flags and bits.inv()
}
win.setAttributes(winParams)
}
또한 추가해야합니다
android:fitsSystemWindows="false"
레이아웃의 루트보기.
답변
나는 같은 문제가있어서 상태 표시 줄 API 19 이상을 그리는 ImageView를 만듭니다.
상태 표시 줄 뒤에 사용자 정의 이미지 설정 gist.github.com
public static void setTransparent(Activity activity, int imageRes) {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {
return;
}
// set flags
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
activity.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
activity.getWindow().setStatusBarColor(Color.TRANSPARENT);
} else {
activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
}
// get root content of system window
//ViewGroup rootView = (ViewGroup) ((ViewGroup) activity.findViewById(android.R.id.content)).getChildAt(0);
// rootView.setFitsSystemWindows(true);
// rootView.setClipToPadding(true);
ViewGroup contentView = (ViewGroup) activity.findViewById(android.R.id.content);
if (contentView.getChildCount() > 1) {
contentView.removeViewAt(1);
}
// get status bar height
int res = activity.getResources().getIdentifier("status_bar_height", "dimen", "android");
int height = 0;
if (res != 0)
height = activity.getResources().getDimensionPixelSize(res);
// create new imageview and set resource id
ImageView image = new ImageView(activity);
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, height);
image.setLayoutParams(params);
image.setImageResource(imageRes);
image.setScaleType(ScaleType.MATRIX);
// add image view to content view
contentView.addView(image);
// rootView.setFitsSystemWindows(true);
}