Android 7.1.1 之實現 3D Touch
轉載請註明出處:http://blog.csdn.net/yyh352091626/article/details/68962736
Shortcut概念
Shortcut 是Android-25(Android 7.1)新增的一項類似iOS的 3D Touch
功能的快捷方式元件,但是有著不同的表現形式,因為Android在硬體上不支援觸控壓力感應,所以表現形式為長按,而iOS須用力長按。
首先,來個效果圖
在 Launcher 或 應用程式列表 裡面,長按應用圖示,彈出一個快捷方式列表, 並且,可以把單個快捷方式拖動出來作為一個桌面圖示,拖出來的圖示會隨著清除應用資料或解除安裝應用而消失,須重新建立。
具體實現
BuildConfig 配置
在主module下,修改 build.grade,使其使用 android-25 的 API 編譯,當然,未下載的,就需要開啟Android SDK Manager下載一下。
android {
compileSdkVersion 25
buildToolsVersion "25.0.0" // 或以上
defaultConfig {
targetSdkVersion 25
}
}
靜態配置
類似BroadCastReceiver,Shortcut註冊也分為靜態註冊和動態註冊,首先介紹靜態註冊,動態註冊後面繼續~~
在
res/xml
資料夾底下建立一個xml,舉個栗子:shortcut.xml<shortcuts xmlns:android="http://schemas.android.com/apk/res/android"
1、enabled:表示當前快捷方式是否可使用
2、 icon: 快捷方式圖示
3、 shortcutDisabledMessage: 快捷方式不可使用時顯示的名字
4、 shortcutId:快捷方式標識
5、 shortcutLongLabel:長按下圖示彈出來列表框中每個快捷名
6、 shortcutShortLabel:快捷是可以單獨顯示在桌面上的,顯示名為shortcutShortLabel
7、 targetClass:點選快捷方式進入的Activity
8、categories 預設寫死即可清單檔案註冊
在 AndroidMainfest.xml 的預設啟動頁裡新增meta-data
標籤配置<activity android:name=".ui.MainActivity" android:configChanges="orientation|screenSize|keyboardHidden" android:screenOrientation="portrait" android:theme="@style/AppTheme.NoneTranslucent"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> <meta-data android:name="android.app.shortcuts" android:resource="@xml/shortcut" /> </activity>
- 完畢! 可以到桌面檢視效果了~~
動態配置
動態建立增加了選單配置的靈活性,比如可以從服務端拉取快捷方式列表,再進行展示。具體配置方法如下:
建立
在需要註冊的地方新增如下程式碼:
/**
* 動態建立
*/
public void register() {
ShortcutManager mShortcutManager = getSystemService(ShortcutManager.class);
List<ShortcutInfo> infos = new ArrayList<>();
// 按下返回按鈕跳轉的activity
Intent intent1 = new Intent(this, MainActivity.class);
intent1.setAction(Intent.ACTION_VIEW);
// 目標activity
Intent intent2 = new Intent(this, PublishPostActivity.class);
intent2.setAction("com.yuyh.xxx.BACK");
Intent[] intents = new Intent[2];
intents[0] = intent1;
intents[1] = intent2;
ShortcutInfo info = new ShortcutInfo.Builder(this, "publish-2")
.setShortLabel("動態建立-釋出帖子")
.setLongLabel("動態建立-釋出帖子")
.setIcon(Icon.createWithResource(this, R.mipmap.ic_bar_detail_write))
.setIntents(intents)
.build();
infos.add(info);
mShortcutManager.setDynamicShortcuts(infos);
}
重新執行app,再次長按,效果如下:
刪除或禁用
動態刪除可以刪除動態配置的快捷方式。
/**
* 動態刪除
*/
public void delete() {
ShortcutManager mShortcutManager = getSystemService(ShortcutManager.class);
/********* 移除彈出列表圖示 **********/
// 所有動態建立圖示
List<ShortcutInfo> infos1 = mShortcutManager.getDynamicShortcuts();
List<String> ids1 = new ArrayList<>();
for (ShortcutInfo info : infos1 ) {
ids1.add(info.getId());
}
// 禁用所有的快捷方式
mShortcutManager.disableShortcuts(ids1, "已禁用");
mShortcutManager.removeDynamicShortcuts(ids1);
/********* 移除拖出來的桌面快捷圖示 **********/
// 放在桌面的圖示
List<ShortcutInfo> infos2 = mShortcutManager.getPinnedShortcuts();
List<String> ids2 = new ArrayList<>();
for (ShortcutInfo info : infos2 ) {
ids2.add(info.getId());
}
mShortcutManager.disableShortcuts(ids2, "已禁用");
mShortcutManager.removeAllDynamicShortcuts();
}
程式碼比較簡單,就不多做敘述了。 須注意一下 getPinnedShortcuts
方法與 getDynamicShortcuts
方法的區別! 禁用後的效果如圖所示,圖示變成灰色:
更新
快捷方式的唯一性,由前面提到的 shortcutId
這個識別符號決定,所以更新快捷方式與建立快捷方式一樣, shortcutId
如果相同, 則會覆蓋之前建立的快捷方式!
返回棧問題
當通過快捷方式開啟時,現有的Activity都會被銷燬,然後重新建立一個Activity棧。因為清單方式設定的快捷鍵的Intent不能自定義Intent的Flag,其預設的Flag是 FLAG_ACTIVITY_NEW_TASK
和 FLAG_ACTIVITY_CLEAR_TASK
。
通過動態註冊的方式,可發現,我們可以配置返回目標activity。當然,靜態配置也可以實現,修改shortcut標籤:
<shortcut
android:enabled="true"
android:icon="@mipmap/ic_bar_detail_write"
android:shortcutDisabledMessage="@string/shortcut_publish"
android:shortcutId="publish"
android:shortcutLongLabel="@string/shortcut_publish"
android:shortcutShortLabel="@string/shortcut_publish">
<!-- 返回目標activity -->
<intent
android:action="com.yuyh.xxx.BACK"
android:targetClass="com.yanshi.writing.ui.MainActivity"
android:targetPackage="com.yanshi.writing" />
<!-- 目標activity -->
<intent
android:action="android.intent.action.VIEW"
android:targetClass="com.yanshi.writing.ui.bar.PublishPostActivity"
android:targetPackage="com.yanshi.writing" />
<categories android:name="android.shortcut.conversation" />
</shortcut>
感謝閱讀!