fix: 首次提交
This commit is contained in:
33
SettingsLib/ActionBarShadow/Android.bp
Normal file
33
SettingsLib/ActionBarShadow/Android.bp
Normal file
@@ -0,0 +1,33 @@
|
||||
package {
|
||||
// See: http://go/android-license-faq
|
||||
// A large-scale-change added 'default_applicable_licenses' to import
|
||||
// all of the 'license_kinds' from "frameworks_base_license"
|
||||
// to get the below license kinds:
|
||||
// SPDX-license-identifier-Apache-2.0
|
||||
default_applicable_licenses: ["frameworks_base_license"],
|
||||
}
|
||||
|
||||
android_library {
|
||||
name: "SettingsLibActionBarShadow",
|
||||
use_resource_processor: true,
|
||||
defaults: [
|
||||
"SettingsLintDefaults",
|
||||
],
|
||||
|
||||
srcs: ["src/**/*.java"],
|
||||
|
||||
static_libs: [
|
||||
"androidx.annotation_annotation",
|
||||
"androidx.lifecycle_lifecycle-runtime",
|
||||
"androidx.recyclerview_recyclerview",
|
||||
],
|
||||
|
||||
sdk_version: "system_current",
|
||||
min_sdk_version: "28",
|
||||
apex_available: [
|
||||
"//apex_available:platform",
|
||||
"com.android.adservices",
|
||||
"com.android.extservices",
|
||||
"com.android.permission",
|
||||
],
|
||||
}
|
||||
21
SettingsLib/ActionBarShadow/AndroidManifest.xml
Normal file
21
SettingsLib/ActionBarShadow/AndroidManifest.xml
Normal file
@@ -0,0 +1,21 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!--
|
||||
Copyright (C) 2018 The Android Open Source Project
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
-->
|
||||
|
||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
package="com.android.settingslib.widget.actionbarshadow">
|
||||
|
||||
</manifest>
|
||||
54
SettingsLib/ActionBarShadow/build.gradle
Normal file
54
SettingsLib/ActionBarShadow/build.gradle
Normal file
@@ -0,0 +1,54 @@
|
||||
/**
|
||||
* Include this gradle file if you are building against this as a standalone gradle library project,
|
||||
* as opposed to building it as part of the git-tree. This is typically the file you want to include
|
||||
* if you create a new project in Android Studio.
|
||||
*
|
||||
* For example, you can include the following in your settings.gradle file:
|
||||
* include ':setupcompat'
|
||||
* project(':setupcompat').projectDir = new File(PATH_TO_THIS_DIRECTORY)
|
||||
*
|
||||
* And then you can include the :setupcompat project as one of your dependencies
|
||||
* dependencies {
|
||||
* implementation project(path: ':setupcompat')
|
||||
* }
|
||||
*/
|
||||
|
||||
plugins {
|
||||
alias(libs.plugins.android.library)
|
||||
alias(libs.plugins.kotlin.android)
|
||||
}
|
||||
|
||||
android {
|
||||
// Not specifying compileSdkVersion here so clients can specify it; must be at least Q
|
||||
namespace = "com.android.settingslib.widget.actionbarshadow"
|
||||
compileSdk 34
|
||||
defaultConfig {
|
||||
minSdkVersion 31
|
||||
targetSdkVersion 34
|
||||
}
|
||||
|
||||
buildTypes {
|
||||
release {
|
||||
minifyEnabled false
|
||||
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard.flags'
|
||||
}
|
||||
}
|
||||
|
||||
sourceSets.main {
|
||||
manifest.srcFile 'AndroidManifest.xml'
|
||||
java.srcDirs = ['src']
|
||||
// res.srcDirs = ['main/res']
|
||||
}
|
||||
|
||||
compileOptions {
|
||||
sourceCompatibility JavaVersion.VERSION_17
|
||||
targetCompatibility JavaVersion.VERSION_17
|
||||
}
|
||||
}
|
||||
|
||||
dependencies {
|
||||
// implementation "androidx.annotation:annotation:1.0.0"
|
||||
implementation libs.androidx.annotation.annotation
|
||||
implementation libs.lifecycle.runtime
|
||||
implementation libs.recyclerview
|
||||
}
|
||||
@@ -0,0 +1,128 @@
|
||||
/*
|
||||
* Copyright (C) 2019 The Android Open Source Project
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package com.android.settingslib.widget;
|
||||
|
||||
import static androidx.lifecycle.Lifecycle.Event.ON_START;
|
||||
import static androidx.lifecycle.Lifecycle.Event.ON_STOP;
|
||||
|
||||
import android.app.ActionBar;
|
||||
import android.app.Activity;
|
||||
import android.view.View;
|
||||
|
||||
import androidx.annotation.VisibleForTesting;
|
||||
import androidx.lifecycle.Lifecycle;
|
||||
import androidx.lifecycle.LifecycleObserver;
|
||||
import androidx.lifecycle.OnLifecycleEvent;
|
||||
|
||||
/**
|
||||
* UI controller that adds a shadow appear/disappear animation to action bar scroll.
|
||||
*/
|
||||
public class ActionBarShadowController implements LifecycleObserver {
|
||||
|
||||
@VisibleForTesting
|
||||
static final float ELEVATION_HIGH = 8;
|
||||
@VisibleForTesting
|
||||
static final float ELEVATION_LOW = 0;
|
||||
|
||||
@VisibleForTesting
|
||||
ScrollChangeWatcher mScrollChangeWatcher;
|
||||
private View mScrollView;
|
||||
private boolean mIsScrollWatcherAttached;
|
||||
|
||||
/**
|
||||
* Wire up the animation to to an {@link Activity}. Shadow will be applied to activity's
|
||||
* action bar.
|
||||
*/
|
||||
public static ActionBarShadowController attachToView(
|
||||
Activity activity, Lifecycle lifecycle, View scrollView) {
|
||||
return new ActionBarShadowController(activity, lifecycle, scrollView);
|
||||
}
|
||||
|
||||
/**
|
||||
* Wire up the animation to to a {@link View}. Shadow will be applied to the view.
|
||||
*/
|
||||
public static ActionBarShadowController attachToView(
|
||||
View anchorView, Lifecycle lifecycle, View scrollView) {
|
||||
return new ActionBarShadowController(anchorView, lifecycle, scrollView);
|
||||
}
|
||||
|
||||
private ActionBarShadowController(Activity activity, Lifecycle lifecycle, View scrollView) {
|
||||
mScrollChangeWatcher = new ActionBarShadowController.ScrollChangeWatcher(activity);
|
||||
mScrollView = scrollView;
|
||||
attachScrollWatcher();
|
||||
lifecycle.addObserver(this);
|
||||
}
|
||||
|
||||
private ActionBarShadowController(View anchorView, Lifecycle lifecycle, View scrollView) {
|
||||
mScrollChangeWatcher = new ActionBarShadowController.ScrollChangeWatcher(anchorView);
|
||||
mScrollView = scrollView;
|
||||
attachScrollWatcher();
|
||||
lifecycle.addObserver(this);
|
||||
}
|
||||
|
||||
@OnLifecycleEvent(ON_START)
|
||||
private void attachScrollWatcher() {
|
||||
if (!mIsScrollWatcherAttached) {
|
||||
mIsScrollWatcherAttached = true;
|
||||
mScrollView.setOnScrollChangeListener(mScrollChangeWatcher);
|
||||
mScrollChangeWatcher.updateDropShadow(mScrollView);
|
||||
}
|
||||
}
|
||||
|
||||
@OnLifecycleEvent(ON_STOP)
|
||||
private void detachScrollWatcher() {
|
||||
mScrollView.setOnScrollChangeListener(null);
|
||||
mIsScrollWatcherAttached = false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Update the drop shadow as the scrollable entity is scrolled.
|
||||
*/
|
||||
final class ScrollChangeWatcher implements View.OnScrollChangeListener {
|
||||
|
||||
private final Activity mActivity;
|
||||
private final View mAnchorView;
|
||||
|
||||
ScrollChangeWatcher(Activity activity) {
|
||||
mActivity = activity;
|
||||
mAnchorView = null;
|
||||
}
|
||||
|
||||
ScrollChangeWatcher(View anchorView) {
|
||||
mAnchorView = anchorView;
|
||||
mActivity = null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onScrollChange(View view, int scrollX, int scrollY, int oldScrollX,
|
||||
int oldScrollY) {
|
||||
updateDropShadow(view);
|
||||
}
|
||||
|
||||
public void updateDropShadow(View view) {
|
||||
final boolean shouldShowShadow = view.canScrollVertically(-1);
|
||||
if (mAnchorView != null) {
|
||||
mAnchorView.setElevation(shouldShowShadow ? ELEVATION_HIGH : ELEVATION_LOW);
|
||||
} else if (mActivity != null) { // activity can become null when running monkey
|
||||
final ActionBar actionBar = mActivity.getActionBar();
|
||||
if (actionBar != null) {
|
||||
actionBar.setElevation(shouldShowShadow ? ELEVATION_HIGH : ELEVATION_LOW);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user