精华内容
下载资源
问答
  • 八戒桌面小工具(一款桌面小插件,挺好用),包括23项常用功能,挺好用,推荐大家下载安装下,just try it,and you will find it really a good desktop tool!
  • iOS14-桌面小插件 IntentConfiguration

    千次阅读 2020-11-03 10:30:39
    今天做一个桌面小插件配置IntentConfiguration的Demo,前面我们留下一个问题没有用的那个intentdefinition,这次我们就创建一个新的工程做一个动态配置数据。按照上上一篇的文章,先创建一个工程。做一个菜单...

    今天做一个桌面小插件配置IntentConfiguration的小Demo,前面我们留下一个问题没有用的那个intentdefinition,这次我们就创建一个新的工程做一个动态配置数据。按照上上一篇的文章,先创建一个工程。做一个菜单小插件。

    创建一个工程命名为IntentWidget,创建一个target命名为MenuConfig,这时候我们先创建一个菜单数据模型,创建一个文件,命名为MenuJson,并添加如下代码:

    struct MenuJson: Codable {
        let id: String
        let name: String
        let image: String
        
        static func createMenuList() -> [MenuJson] {
            var list = [MenuJson]()
            list.append(.init(id: "1", name: "西红柿炒鸡蛋", image: ""))
            list.append(.init(id: "2", name: "水煮肉片", image: ""))
            list.append(.init(id: "3", name: "白菜粉条", image: ""))
            list.append(.init(id: "4", name: "鱼香肉丝", image: ""))
            return list
        }
    }
    

    在MenuConfig.intentdefinition的文件里添加一个MenuList类型,显示名称改成菜单列表,如下图:

    然后在添加一个type变量,选择类型为MenuList,并选中Options are provided daynamically,如下图:

    然后再创建一个Intents Extension扩展,需要动态处理数据。可以命名为MenuHandle,会出现一个文件IntentHandler.swift,我们在这里实现ConfigurationIntentHandling这个协议。如下:

    
    class IntentHandler: INExtension,ConfigurationIntentHandling {
        
        func provideTypeOptionsCollection(for intent: ConfigurationIntent, with completion: @escaping (INObjectCollection<MenuList>?, Error?) -> Void) {
            
            let list = MenuJson.createMenuList().map { (item) -> MenuList in
                .init(identifier: item.id, display: item.name)
            }
            
            completion(.init(items: list), nil)
        }
        
        
        override func handler(for intent: INIntent) -> Any {
            // This is the default implementation.  If you want different objects to handle different intents,
            // you can override this and return the handler you want for that particular intent.
            
            return self
        }
        
    }
    

    接下来修改实体类SimpleEntry,如下:

    struct SimpleEntry: TimelineEntry {
        let date: Date
        let configuration: ConfigurationIntent
        let menu: MenuList
        
    }

        Provider这个结构体修改为如下:

    struct Provider: IntentTimelineProvider {
        let list = MenuJson.createMenuList().map { (item) -> MenuList in
            .init(identifier: item.id, display: item.name)
        }
        func placeholder(in context: Context) -> SimpleEntry {
            SimpleEntry(date: Date(), configuration: ConfigurationIntent(), menu: list[0])
        }
    
        func getSnapshot(for configuration: ConfigurationIntent, in context: Context, completion: @escaping (SimpleEntry) -> ()) {
            
            var firstItem = list.filter { (item: MenuList) -> Bool in
                item.identifier == configuration.type?.identifier
            }
            if firstItem.count == 0 {
                firstItem = list
            }
            
            
            let entry = SimpleEntry(date: Date(), configuration: configuration, menu: firstItem[0])
            completion(entry)
        }
    
        func getTimeline(for configuration: ConfigurationIntent, in context: Context, completion: @escaping (Timeline<Entry>) -> ()) {
            
            var firstItem = list.filter { (item: MenuList) -> Bool in
                item.identifier == configuration.type?.identifier
            }
            if firstItem.count == 0 {
                firstItem = list
            }
            
            var entries = [SimpleEntry]();
            entries.append(.init(date: Date(), configuration: configuration, menu: firstItem[0]));
            
            completion(Timeline(entries: entries, policy: .atEnd ))
            
            
        }
    }

    视图我们可以修改成如下的代码:

    struct MenuConfigEntryView : View {
        var entry: SimpleEntry
    
        var body: some View {
            let item = MenuJson.createMenuList().first { (subItem: MenuJson) -> Bool in
                subItem.id == entry.menu.identifier
            }
            return GeometryReader(content: { (geometry: GeometryProxy) in
                VStack(alignment: .center){
                    Image(uiImage: UIImage(named: item!.image)!).frame(width: geometry.size.width - 40, height: geometry.size.height - 80, alignment: .center).aspectRatio(contentMode: .fit).clipped()
                    Text(item?.name ?? "")
                }.frame(width: geometry.size.width, height: geometry.size.height, alignment: .center)
            })
        }
    }

    最后加上图片,运行效果图如下:

     

    后记:如果没有出现选项框,需要我们添加App GoupID,并在MenuHandle的扩展里的plist里加上NSExtension这个字典如下图:

    这个就是动态配置数据的方法。好了就到这里,成功的路上总不缺少努力的人。

     

    展开全文
  • iOS14新增桌面小插件,对于适配来说,还是需要记录一下的,今天配置一个简单的桌面小插件。 设备准备:Version 12.1 (12A7403) macOS Catalina 10.15.4 首先先创建一个工程,命名为StaticWidget,如下图所示: ...

    iOS14新增桌面小插件,对于适配来说,还是需要记录一下的,今天配置一个简单的桌面小插件。

    设备准备:Version 12.1 (12A7403)  macOS Catalina 10.15.4

    首先先创建一个工程,命名为StaticWidget,如下图所示:

    我们首选SwiftUI开发,对于开发桌面小程序来说,只能用SwiftUI,这也是我们使用SwiftUI开发一个重要原因。

    创建Widget

    我们先创建一个Target,选择widget。如下图:

    这里需要注意一下,记得选中Include Configuration Internt这个选项,他会自动创建配置文件。创建后的目录如下:

     

    我们来看一下这个工程里的主函数,如下;

    @main
    struct MainWidget: Widget {
        let kind: String = "MainWidget"
    
        var body: some WidgetConfiguration {
            
            IntentConfiguration(kind: kind, intent: MainConfigIntent.self, provider: DengjiProvider()) { entry in
                MainWidgetEntryView(entry: entry)
            }
            .configurationDisplayName("My Widget")
            .description("This is an example widget.")
        }
    }
    

    改成如下的函数:

    
    @main
    struct EnglishLevel: Widget {
        let kind: String = "EnglishLevel"
    
        var body: some WidgetConfiguration {
            StaticConfiguration(kind: kind, provider: Provider()) { (entry)  in
                EnglishLevelEntryView(entry: entry)
            }.configurationDisplayName("My Widget")
            .description("This is an example widget.")
    
        }
    }

    这个是静态的配置,不能动态改变。不需要配置太多。这时候我们需要修改Provider,需要他实现TimelineProvider协议。

    下面我们看看怎么实现TimelineProvider协议。首先找到这个结构体,并且删除原来的方法,实现TimelineProvider协议。如下:

    
    struct Provider: TimelineProvider {
    
        
        func getSnapshot(in context: Context, completion: @escaping (SimpleEntry) -> Void) {
            completion(.init(date: Date(), listDate: ["英语4级"]))
        }
        
        func getTimeline(in context: Context, completion: @escaping (Timeline<SimpleEntry>) -> Void) {
            
            completion(.init(entries: [.init(date: Date(), listDate: ["小明:","英语8级"])], policy: .atEnd))
        }
        
        func placeholder(in context: Context) -> SimpleEntry {
            SimpleEntry(date: Date(), listDate: ["初级"])
        }
    
    }

    这时候 我们需要重新定义SimpleEntry,这个是数据源,需要们去维护,修改如下:

    struct SimpleEntry: TimelineEntry {
        let date: Date
    //    let configuration: ConfigurationIntent
        let listDate: [String]
    }
    

    这个实际上根据自己的需要添加属性,我们这个以listDate为粒子,字符串数组。那么和他相关的视图也要修改如下:

    struct EnglishLevelEntryView : View {
        var entry: Provider.Entry
    
        var body: some View {
            var value = "";
            for item in entry.listDate {
                value += item;
            }
            return Text(value)
            
        }
    }
    

    运行后效果如下;

     

     

    至此,一个简单的小插件已经完成,多做些小练习也可以快速进入转态,学习的道路上总不缺少努力的人。

    留下一个问题EnglishLevel.intentdefinition这个文件没有用到,下一篇写这个例子。

    展开全文
  • Android桌面小插件——Widget

    千次阅读 2015-12-31 18:08:00
    Android桌面小插件——Widget效果图实现1. 创建Widget类 创建一个Widget类,并实现页面创建的时候,就实现显示时间 package com.kongqw.kqwwidget;import android.appwidget.AppWidgetManager; import android.app...

    Android桌面小插件——Widget

    效果图

    这里写图片描述

    实现

    1. 创建Widget类

    创建一个Widget类,并实现页面创建的时候,就实现显示时间

    package com.kongqw.kqwwidget;
    
    import android.appwidget.AppWidgetManager;
    import android.appwidget.AppWidgetProvider;
    import android.content.ComponentName;
    import android.content.Context;
    import android.content.Intent;
    import android.widget.RemoteViews;
    import android.widget.Toast;
    
    import java.text.DateFormat;
    import java.text.SimpleDateFormat;
    import java.util.Date;
    import java.util.Timer;
    import java.util.TimerTask;
    
    /**
     * Created by kongqw on 2015/12/31.
     */
    public class KqwWidget extends AppWidgetProvider {
        @Override
        public void onDeleted(Context context, int[] appWidgetIds) {
            super.onDeleted(context, appWidgetIds);
        }
    
        @Override
        public void onDisabled(Context context) {
            super.onDisabled(context);
        }
    
        @Override
        public void onEnabled(Context context) {
            super.onEnabled(context);
        }
    
        @Override
        public void onReceive(Context context, Intent intent) {
            super.onReceive(context, intent);
        }
    
        @Override
        public void onUpdate(final Context context, final AppWidgetManager appWidgetManager, int[] appWidgetIds) {
            super.onUpdate(context, appWidgetManager, appWidgetIds);
    
            Timer timer = new Timer();
            TimerTask timerTask = new TimerTask() {
                @Override
                public void run() {
                    ComponentName provider = new ComponentName(context.getApplicationContext(), KqwWidget.class);
                    /*
                     * 获取Widget远程View对象
                     * 参数1 Widget的包名
                     * 参数2 Widget的布局id
                     */
                    RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.appwidget);
                    // 获取远程View布局中的控件
                    Date date = new Date();
                    DateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                    String time = format.format(date);
                    views.setTextViewText(R.id.textView, "时间:" + time);
    
                    appWidgetManager.updateAppWidget(provider, views);
                }
            };
            // 开启定时任务,每5秒更新执行一次
            timer.schedule(timerTask, 1000, 1000);
        }
    
    
        public void method(Context context) {
            Toast.makeText(context, "KqwWidget里的方法", Toast.LENGTH_SHORT).show();
        }
    }

    2. 在清单文件中注册Widget控件

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.kongqw.kqwwidget">
    
        <application
            ……>
            ……
    
            <receiver android:name=".KqwWidget" >
                <intent-filter>
                    <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
                </intent-filter>
                <meta-data
                    android:name="android.appwidget.provider"
                    android:resource="@xml/appwidget_info" />
            </receiver>
    
        </application>
    </manifest>

    3. 创建Widget配置文件

    在res下创建xml文件夹,在xml下创建appwidget_info.xml文件

    <?xml version="1.0" encoding="utf-8"?>
    <appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
        android:initialLayout="@layout/appwidget"
        android:minHeight="72dp"
        android:minWidth="294dp"
        android:previewImage="@mipmap/ic_launcher"
        android:updatePeriodMillis="86400000" />

    P2

    4. 添加Widget布局文件

    appwidget.xml

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="100dp"
        tools:context="com.kongqw.kqwwidget.MainActivity">
    
        <TextView
            android:id="@+id/textView"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:background="#FFFFFFFF"
            android:gravity="center"
            android:text="时间"
            android:textColor="#FF000000"
            android:textSize="30dp" />
    </RelativeLayout>

    调用Widget里的方法

    可以做一些操作Widget数据的操作

    KqwWidget kqwWidget = new KqwWidget();
    kqwWidget.method(this);
    展开全文
  • 桌面频谱插件

    2015-05-17 21:20:56
    桌面频谱插件
  • 试着做了一个Wedget小插件 也能成功运行了。发现小插件的大小和对齐方式还有点问题 请教各位大牛们. xmlns:android="http://schemas.android.com/apk/res/android" android:minWidth="210dip" android...
  • 桌面小组件不仅具有清新的界面更有丰富的功能等你来体验,简单的操作方式让你的手机桌面更加个性化,可以添加各种不同类型的时钟以及丰富的组件任意搭配,不同的规格不同的尺寸适合各种用户需求,软件功能丰富上手...

    桌面小组件不仅具有清新的界面更有丰富的功能等你来体验,简单的操作方式让你的手机桌面更加个性化,可以添加各种不同类型的时钟以及丰富的组件任意搭配,不同的规格不同的尺寸适合各种用户需求,软件功能丰富上手容易值得一试。喜欢的朋友赶紧来下载吧!

    桌面小组件最新版介绍:

    桌面小组件让您前所未有的个性化您的主屏幕。一款功能丰富的小组件app,添加炫酷时钟,多种组件任意组合,随意挑选,打造属于你自己的专属桌面。

    652ddf41de2f4c8c43be33fd8e35272c.png

    桌面小组件app特点:

    1、在桌面上进行操作,可以在主桌面屏上添加喜欢的时钟;

    2、可以自定义桌面组件的尺寸大小,拥有不同规格尺寸可以选择;

    3、支持多种组件任意搭配组合,制作出你的专属桌面时钟;

    4、拥有多种类型的时钟可以选择,每一种都具有专属风格;

    5、添加成功后,每次打开手机都可以看到设置的桌面时钟;

    6、拥有许多种颜色的时钟,每一种时钟样式都别具一格;

    软件优势:

    1.事件插件:多种风格记录您的珍贵时刻,时刻提醒您的重要纪念日;

    2.壁纸插件:选一张漂亮的壁纸,作为桌面小插件,时刻彰显您的品味;

    3.倒计时插件:记录各种重要日子,重要事件自定义提醒,有我陪伴,铭记在心;

    4.天气插件:实时根据当地天气情况同步到桌面显示,不同于他人,凸显您的个性美;

    5.更多小组件等你来发现,快来编辑属于你独一无二的精美组件吧事件插件。

    使用方法:

    第一步,打开APP添加自己喜欢的组件样式。

    第二步,返回手机桌面,长按或者双指内滑,选择窗口小工具(小部件)。

    第三部,找到桌面小组件,选择尺寸,添加到桌面。

    第四步,根据提示选取之前添加的样式。

    包名:com.sdx.widget

    MD5:ec45fa90aaa5ebcb03693822192be0c4

    展开全文
  • onEnabled()//当桌面插件第一个移到桌面(因为插件可以同时多个存在桌面嘛)一般我在这启动服务 onDisabled()//当桌面插件最后一个移出桌面,一般我在这停止服务 onUpdate()//更新桌面的操作。 第四步:也...
  • 所以如果不是做系统开发,只是做一般的应用开发,不要在桌面小插件上面做进度条刷新显示的实现。 而小米手机的音乐插件其实并不是一个插件,因为其实现是在Launcher上面,并不是在音乐播放器上面。因小米手机...
  • 立方体桌面插件 立方体桌面插件立方体桌面插件
  • xp桌面插件

    2013-05-12 16:44:55
    xp桌面插件
  • 桌面股票查看插件.zip

    2020-07-03 12:26:19
    非常方便的桌面股票查看插件。内存很功能很强大。方便上班族使用。实现实时盯盘。还可以实时买卖提醒
  • 解压后是雨滴桌面的皮肤,包含各种插件和套装,可以直接解压使用,很方便,建议大家可以下载。
  • win7桌面实用工具,用于对流量,CPU,显卡监测(有用的小插件),非常简洁,小巧,实用
  • 【Android】开发桌面小插件(一)

    千次阅读 2011-12-14 21:57:24
    ... 应用程序窗口部件(Widget)是微小的应用程序视图,可以被嵌入到其它应用程序中(比如桌面)并接收周期性的更新。你可以通过一个App Widget provider来发布一个Widget。可以容纳其它App Wid
  • 蛮不错的一款软件,没广告,又小巧,固定在桌而的右下角
  • 雨滴桌面插件

    2013-10-08 19:38:51
    以雨滴插件为载体设计的包含一些罪恶王冠主题的插件还有祈妹哟。
  • 【Android】开发桌面小插件(二)

    千次阅读 2011-12-14 22:00:24
     我们这一片是接着上一篇来继续进行讲解开发插件,那么我们现在就来继续的讲解App Widget布局,那就不多说了,我们来看看内容吧:  创建App Widget布局  你必须在XML中为你的App Widget定义一个初始布局...
  • Android 桌面插件

    2013-08-13 16:37:56
    Android 桌面插件
  • DandyWeather(桌面天气插件)是一款小巧的桌面天气插件,天气信息来源于中国气象局,具有天气信息准确,自动定位等特征。   DandyWeather(桌面天气插件) v14.10.13更新内容: 1,新增动态指针时钟.
  • 自用gnome桌面美化插件

    万次阅读 2017-12-06 14:42:11
    扩展插件 ...这个插件大部分使用gnome桌面都会装 3、Drop down terminal 能从屏幕边缘快捷唤出终端,不用时再按快捷键缩回去 4、User themes  这个是最主要的,打开这个才能使用其他扩展 这
  • 鱼鱼桌面插件(打包后的),鱼鱼 桌面插件 鱼鱼桌面插件,看看吧
  • 蓝牙桌面插件

    2015-12-30 11:01:41
    可以在桌面添加一个部件,用以查看蓝牙电量,连接时长,并管理设备.apk

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 91,806
精华内容 36,722
关键字:

如何删除桌面小插件