桌面重压菜单适配

来自Flyme开放平台
跳转至: 导航搜索
1.简介:

        桌面作为各应用展示平台,对于所有应用都有一定的战略意义。对于提供了压力触控的机型,各应用通过本文档所示简单适配后,就能够在重压图标条件下提供展示快捷入口菜单功能,这样可以在不直接打开应用的情况下进入常用界面,提升了用户体验和使用效率,具体效果可见下图的演示,或者直接安装文档尾部附件的demo来体验。

 

b8c698b295964a2ab69142529a6184c6.gif

 

 

 
2.适配:
 
  • AndroidManifest添加meta-data
<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme">
 
    <meta-data
        android:name="android.3dtouch.launcher_menu"
        android:resource="@xml/launcher_menu" />
  • Activity层级下增加IntentFilter:
<intent-filter>
    <action android:name="android.intent.action.VIEW" />
    <category android:name="android.intent.category.DEFAULT" />
    <category android:name="android.intent.category.BROWSABLE" />
 
    <data
        android:host="com.meizu.media.reader"
        android:path="/message"
        android:scheme="flyme_3dtouch" />
    <data
        android:host="com.meizu.media.reader"
        android:path="/rss"
        android:scheme="flyme_3dtouch" />
</intent-filter>
 
  • 工程res/xml下增加文件launcher_menu.xml
<?xml version="1.0" encoding="utf-8"?>
<launcher_menu xmlns:android="http://schemas.android.com/apk/res/android">
    <menu android:title="@string/msg1" data="flyme_3dtouch://com.meizu.media.reader/message" icon="&#xe005;" />
    <menu android:title="@string/msg2" data="flyme_3dtouch://com.meizu.media.reader/rss" icon="&#xe006;" />
</launcher_menu>
  • 说明:
  1. meta-data需要在AndroidManifest的application下添加(meta-data注意大小写、拼写完整)。
  2. meta-data nameandroid.3dtouch.launcher_menuandroid.3dtouch.launcher_menuresource值是launcher_menu的xml文件(以其他命名的xml都是允许的)。
    (1)meta-data有name为android.3dtouch.launcher_menu,表示应用支持Flyme的3DTouch功能。
    (2)应用添加该meta-data后,安装到Flyme系统,表示该应用在Flyme系统中是支持桌面3DTouch弹出快捷菜单功能。应用添加适配代码在其他第三方机型上是没有影响。
  3. 应用需要添加android.intent.category.BROWSABLEintent-filter,确保应用Uri的启动入口方法。intent-filter添加到应用需要入口的activity中。
  4. 应用内部需要适配定义的uri入口跳转,例如
     Uri data = intent.getData();
        if (data != null && TextUtils.equals("forcetouch", data.getScheme())) {
            if( TextUtils.equals("/message”, data.getPath())) {
                Fragment fragment = ReaderMessageFragment.newInstance(R.string.message);
                ReaderUtils.tryStartFragment(this, fragment);
                return;
            }
            if(TextUtils.equals("/rss",data.getPath()) ){
                ReaderUtils.tryStartFragment(this, new ReaderRssFragmentShow());
                return;
            }
        }

     

  5. launcher_menu.xml对应的是弹出桌面快捷菜单的名字android:name、界面入口data数据以及图标icon
         (1)字段已更改为launcher_menu。android:name更改为android:title。
         (2)android:title需要表示桌面快捷菜单显示list项的名字,应用需适配好多国语言。弹出列表项顺序以menu的顺序一致。
         (3)data字段表示启动列表对应应用的uri,uri需要应用内部适配,应用需要增加intent-filter并在代码中实现跳转逻辑,保证提供的uri能正常从Launcher进入到应用对应的入口。data的uri是forcetouch://com.meizu.media.reader/message与forcetouch://com.meizu.media.reader/rss,scheme可约定一个字符串,例如flyme_3dtouch,写成其他的scheme也可以;host要求写应用对应的包名;path作为入口的区分。与launcher_menu.xml中为data值对应。应用需要添加Intent.FLAG_ACTIVITY_NEW_TASK入口。
         (4)icon字段表示桌面快捷菜单显示list项的图标,图标以iconFont来获取显示,需要适配的应用在Flyme的iconFont中选择适配的应用图标,该字段写入的是iconFont对应的编码而不能写@drawable相关的图片资源。如该列表项没有图标,icon字段需要写为@null。
  6. 如果适配应用在5.中launcher_menu.xml配置错误属性,如将android:title="@string/msg1" 配置为android:title="msg1" ,将该条目的list项名称默认赋值为“null”。
  7. 测试添加的入口是否能正常启动,adb手动启动指定界面。
    adb shell am start  -d flyme_3d[[|touch://com.meizu.media.reader/message]]
    adb shell am start  -d [[|flyme_3d]][[|touch]][[|://com.meizu.media.reader/rss]]
  8. iconFont图标下载,打开附件中的iconfont.pdf文件,以主题图标为例,是&#e031;主题图标对应的字符,应用适配只需要在icon项中填写对应图标的字符加上‘x’符号即可,如,&#e031 应填为 &#xe031。
 

 

 
3.Demo说明:
按照上述说明,简单App配置三个文件即可完成适配,如下:
 
  • Activity层级下增加IntentFilter:在AndroidManifest里配置metadata和IntentFilter:
<activity android:name=".MainActivity">
    <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.VIEW" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />
 
        <data
            android:host="com.meizu.forcetouch.mzfixeddemo"
            android:path="/a1"
            android:scheme="flyme_3dtouch" />
        <data
            android:host="com.meizu.forcetouch.mzfixeddemo"
            android:path="/f1"
            android:scheme="flyme_3dtouch" />
        <data
            android:host="com.meizu.forcetouch.mzfixeddemo"
            android:path="/f2"
            android:scheme="flyme_3dtouch" />
    </intent-filter>
 
</activity>
<activity android:name=".SecondActivity">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
 
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
    <!-- 用于接收压力触控的过滤器-->
    <intent-filter>
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />
 
        <data
            android:host="com.meizu.forcetouch.mzfixeddemo"
            android:path="/a2"
            android:scheme="flyme_3dtouch" />
    </intent-filter>
 
</activity>
 
<!-- name值必须为"android.3dtouch.launcher_menu"-->
<meta-data
    android:name="android.3dtouch.launcher_menu"
    android:resource="@xml/launcher_menu"/>
 

 

  • Activity层级下增加IntentFilter:AndroidManifest中的metadata配置的launcher_menu.xml文件配置如下:
<?xml version="1.0" encoding="utf-8"?>
<launcher_menu xmlns:android="http://schemas.android.com/apk/res/android">
    <menu android:title="@string/start_activity1" data="flyme_3dtouch://com.meizu.forcetouch.mzfixeddemo/a1" icon="&#xe005;" />
    <menu android:title="@string/start_activity2" data="flyme_3dtouch://com.meizu.forcetouch.mzfixeddemo/a2" icon="&#xe006;" />
    <menu android:title="@string/start_fragment1" data="flyme_3dtouch://com.meizu.forcetouch.mzfixeddemo/f1" icon="&#xe005;" />
    <menu android:title="@string/start_fragment2" data="flyme_3dtouch://com.meizu.forcetouch.mzfixeddemo/f2" icon="&#xe006;" />

 

  • Activity处理:
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    parentView = (RelativeLayout)findViewById(R.id.parent);
    f1 = new Fragment1();
    f2 = new Fragment2();
    Intent intent = getIntent();
    if (intent != null) {
        Log.d("mzLog", "getIntent != null : intent---->" + intent.toString());
        Uri data = intent.getData();
        if (data != null && TextUtils.equals("flyme_3dtouch", data.getScheme())) {
            if (TextUtils.equals("/f1", data.getPath())) {
                tryStartFragment(f1, this);
                return;
 
            } else if (TextUtils.equals("/f2", data.getPath())) {
                tryStartFragment(f2, this);
                return;
            }
        }
    }
}

 

文件

IconFont.pdf

MzFixedDemo.zip

导航菜单