当前位置:求职简历网 > 知识 > 正文

widget开发

iOS14 Widget小组件开发(Widget Extension) File - New - Target - Widget Extension 本文主要以 未勾选 用户配置属性的情况说明 为小组件展示提供一切必要信息的结构体,遵守 TimelineProvide

iOS14 Widget小组件开发(Widget Extension)

File -> New -> Target -> Widget Extension 本文主要以 未勾选 用户配置属性的情况说明 为小组件展示提供一切必要信息的结构体,遵守 TimelineProvider 协议,产生一个时间线,告诉 WidgetKit 何时渲染与刷新 Widget,时间线包含一个你定义的自定义TimelineEntry类型。时间线条目标识了你希望WidgetKit更新Widget内容的日期。在自定义类型中包含你的Widget的视图需要渲染的属性。 Timeline的刷新策略是会延迟的,并不一定根据你设定的时间精确刷新。同时官方说明了每个widget窗口小部件每天接收的刷新都会有数量限制 TimelineProvider官方解释 渲染 Widget 所需的 数据模型 ,需要遵守 TimelineEntry 协议。 屏幕上 Widget 显示的内容,可以针对不同尺寸的 Widget 设置不同的 View。 一个Widget只能实现大中小三个不同尺寸的组件形式,如果现有需求要做不同功能并且相同尺寸规格的组件则需要实现多组件 1.通过修改原Widget入口文件方法添加更多配置来支持多个Widget 2.另建SwiftUI文件实现组件功能,并去除 @main ,修改相同函数名 并在Widget页面中 Entry 中绑定对应的模型 如果主APP用的swift编写,可以将网络请求模块文件共享或pods库共享(方法后文会介绍) posterFromJson 此数据模型转换方法仅适用简易接口(为了偷懒🤷‍♀️),复杂数据模型还是用 HandyJSON 或 KaKaJson 解析 若用第三方模型转换方法,图片的同步请求处理放置于 getTodayPoster 的请求中同步处理即可 然后更新补全 placeholder getSnapshot Previews 处相应的 Entry 即完成Widget内容展示 点击Widget窗口唤起APP进行交互指定跳转支持两种方式: Widget三种尺寸规格中 接收方式 APPDelegate 中接收返回的URL 如果项目实现了 SceneDelegate 则需要在 SceneDelegate 里面实现跳转处理 由于widget跟APP间相互独立,如果想用相同的数据则需要两者间数据共享,创建 App Group 主APP中 Target -> Signing & Capability -> +Capability -> 添加 App Group ps:网上说的还需创建申请 APPID 但在开启自动管理 Automatically manage signing 的情况下xcode会自动给你创建相关联的APPID 两者间的数据共享主要通过 UserDefaults 和 FileManager 两种形式。 以OC中使用 UserDefaults 共享数据为例 oc、swift混编调用 完成后即可使用pods中的第三方SDK了 Pods第三方SDK使用错误提示 如果在pods导入共享第三方库,或者使用 [UIApplication sharedApplication] 方法报错如下时 则需要在 pods Target 里面,选中出错的SDK并点击 buildSettings 搜索 Require 然后把 Require Only App-Extension-Safe API 然后把YES改为 NO 即可

这8款Android桌面小部件,能让你的Android好用很多倍

安卓手机一直以来以其可玩性高而受到欢迎,即使是简单的桌面小部件,也有人能玩出花来。强大如 Zooper Widget 和 KWGT 等复杂且定制性极强的美化类桌面插件应用,抑或是朴实无华但又必不可少的时间和天气小部件,桌面小部件实实在在地占据着每一部安卓手机桌面的一部分。

手机毕竟是拿来用的,对于大部人来说,是否实用、美观和方便才是考量一个小部件能否在桌面上生存的必要条件。本文就旨在介绍一些值得我们放置在桌面的应用小部件。

这些小部件更实用

Another Widget

自 Pixel Launcher 推出以后,简洁实用的 At A Glance 桌面插件便成为了诸多安卓用户心头的一颗朱砂痣,奈何高贵的 Pixel 用户专属这一限制使得我等只得望洋兴叹。好在,万能的 XDA 大神们动手破除了 Pixel Launcher 的诸多限制,使得更多人得以享用这一特性。但是面对更改图标困难、界面相对简陋的 Pixel Launcher ,广大人民群众日益增长的对于高自定义的需求和现有的不足之间的矛盾日益凸显。 Another Widget 的出现便很好地解决了这一矛盾:




Another Widget 的设置界面

Another Widget 是一款像素级模仿 At A Glance 这一特性的桌面小部件,对比 At A Glance ,它还有如下优点:支持更换字体颜色,可自定义显示的日历,设置即将到来的事件最早何时可以显示在桌面,还可以切换天气源。




显示效果

Google Calender 的日程列表

Google Calendar 的小部件有两种,一种为月视图,另一种为日程列表。相比于月视图,将日程列表放置在桌面更能帮助我们了解接下来的日程,起到良好的提醒作用。




Google Calender 日程列表

倒计时类

每个人的人生中总有些特殊而重要的时刻值得我们铭记和回顾,这个时候,把它们放置在桌面就显得很有必要。放置重要考试的倒计时能让我们每次看到桌面都「胆战心惊」,提醒我们滚去学习;同样也可以放置亲人或男/女朋友的生日倒计时乃至你们共同度过了多久的甜蜜岁月。万一被男/女朋友「不小心」看到没准还会被夸很有心。

我们可以使用「何时」、「倒数日」、「Hurry」等应用来添加倒计时小部件到桌面。




单事件效果对比

帮你更快地触发所需功能的小部件

iOS 于 2015 年宣布了 3D Touch 这一特性,旨在提高手机操作效率,帮助用户更快地从桌面进入所需功能。一年后,谷歌也推出了 Shortcuts 这一特性,其一度被看作是安卓版的 3D Touch 功能。不过不同于 3D Touch 对于手机硬件的硬性需要, Shortcuts 则只需要系统(Android 7.1 及以上)和应用支持,门槛低上了不少(安装 Nova Launcher 等第三方桌面更是可以让低安卓版本也享受这一特性)。




App Shortcuts

事实上,无论是 3D Touch 还是 App Shortcuts ,用户的实际利用率一直不高,一是因为每个应用长按调出的菜单功能不一样,记忆难度大;二是因为用户难以形成习惯。更不必说,许多国产定制 UI 直接阉割掉了这一功能。当然,我们还是可以尽可能地把这一特性利用起来,使之服务于我们。谷歌允许用户将 Shortcuts 中的某一项通过拖拽固定在桌面,这为用户提供了不少方便。那么哪些快捷方式值得我们单独将其放置在寸土寸金的桌面上呢?

支付宝「扫一扫」和「付款码」等小部件

移动支付的燎原之火早已烧遍全国,连门口卖鸡蛋灌饼的大爷都知道让你扫他的红包码了。扫码已经变成了手机摄像头所承担的重要功能之一,把「扫一扫」的小部件放在桌面,我们便无需再靠着一指禅点点点,只需一步,就能潇洒地付款走人。同样,「付款码」小部件放置在桌面也能在一定程度上减少操作。每次在超市排队的时候,看到大爷大妈们手忙脚乱地找付款码,都不禁感叹,所谓的科技进步带来的便捷究竟何时才能被所有人共享。




支付宝扫一扫

在这里不得不批评一下「生活方式应用」某信了,时至今日安卓版的微信也不支持 Shortcuts ,落后支付宝不是一点半点,是半年啊。想要快速打开微信扫一扫或者付款码我们只能等待官方支持了,当然了,MIUI 等国产系统的负一屏支持快速打开这些活动。对于原生或类原生系统的用户来说,现有方式均需要获取 root 权限,考虑到安全性,在此不做推荐。

虾米的「每日播放 30 首」和网易云的「私人 FM」

如果只是想要听歌,为了躲开漫长的开屏广告,我们可以把相应的快捷方式放置于桌面。这样只需一键便可开始畅享音乐。

通过常规方式打开:




常规方式打开

通过快捷方式打开:




快捷方式打开

同样实用的还有一闪的「相机」快捷方式,手机默认设置的「电池使用情况」快捷方式,适合更新强迫症的 Play Store 的「我的应用」快捷方式等等。我们可以根据自己使用某一功能的频率来决定是否需要放置相应的小部件,对于一些使用率不高的功能,我们通过长按图标调出即可。




值得一试的快捷方式

为了好玩,没卵用也要放的小部件

有些时候,为了好玩和个性,许多人会花费大量时间来美化桌面。这种行为我认为属于个人的爱好,尊重即可。不过,如果你只是想要小小地折腾一下,这里也推荐一款好玩的应用:会话微件。

会话微件支持在桌面放置「对话」、「单句」和「卡片」,甚至支持和同样使用这一应用的人在桌面上「聊天」。我们可以利用会话微件放置自己喜欢的歌词或名言,还能够查看天气甚至查询物流情况,根据会话微件的教程,我们能够做出各种效果的桌面小部件。具体实用与否还要由你来定夺。


iOS14 Widget小组件开发实践3——Widget点击交互

根据官方文档的描述,点击 Widget 窗口唤起 APP 进行交互指定跳转支持两种方式: Widget 支持三种显示方式,分别是 systemSmall 、 systemMedium 、 systemLarge ,其中: 1、 systemSmall 只能用 widgetURL 修饰符实现URL传递接收。 2、 systemMedium 、 systemLarge 可以用 Link 或者 widgetUrl 处理 这两种方式的本质都是 URL Schemes 在查找资料的时候,看到网上有的地方说在 AppDelegate 实现 OpenUrl 进行跳转处理: 然而试了之后发现根本没有响应,其实是需要在 SceneDelegate 里面实现跳转处理,因为 iOS13 后, APP 的 UI 生命周期交由 SceneDelegate 管理,这里拿到需要的 URL ,就能处理产品需求实现了。 creating-a-widget-extension https://swiftrocks.com iOS13 URL Schemes 跳转与传值问题

iOS 14 widget功能介绍

Widget不是一个小型的App,它是一种新的桌面内容展现形式,展示在Home Screen上,能快速提供用户关心的内容是重点,主要用于弥补主App无法及时展示用户所关心的数据。 优秀的Widget有三个特点: 具体图片尺寸 苹果提供Widget的可配置能力 Widget的UI是无状态的 唯一支持的只有用户点击和DeepLink唤起主app Widget的核心是Timeline,即一条时间线,在对应的时间点展示对应的UI 时间线由一个或多个时间线入口TimelineEntry以及一个重载策略ReloadPolicy组成,该重载策略会通知WidgetKit何时请求后续时间线。 重载策略(接下来这段时间Timeline的刷新策略)有以下几种策略: Widget的刷新完全由WidgetCenter控制。需要通过生成一个新的时间线来替换旧的时间线,Reload Timeline并不是直接刷新Widget,而是WidgetCenter重新请求下一个时间线的数据。 系统提供两种方式来刷新Timeline: 示例:每5分钟刷新一下时间线

有谁知道Widget应用程序的开发工具是什么?

Widget (建议中文译名:微巨) 「Yahoo!Widget Engine」是一种基于JavaScript的应用程序平台,您必须先安装Widget引擎后才能使用各式各样的Widget工具。
Yahoo!Widget是由雅虎推出的免费并开放源码的桌面应用程序平台。它由Widget引擎和Widget工具两部分组成。能够极大的便利您的网络操作和完善您的桌面应用。Widget引擎提供了一个Ajax应用程序平台,在Windows和Mac OS X的操作系统环境下都可以使用。安装引擎后就能在此平台上运行各式各样的Widget工具了。
1. Widget的这个创想来自一个叫做Rose的苹果电脑工程师。98年的一天,Rose在自己的苹果操作系统桌面玩一个可以更换皮肤的MP3播放器时忽发奇想:如果在我桌面上运行的所有工具都能够更换皮肤或外观,那将是一件很酷的事情,Rose的兴奋之情溢于言表,它给这个酷酷的玩意儿起了个名字叫“Konfabulator”。
于是两人开始共同为了这个炫酷的玩意儿在深夜努力工作,他们开辟了一个和Konfabulator相关的网站向大家传播这个想法,并在论坛中征询网友的意见“到底什么才是真正的Konfabulator?”大家的说法是千奇百怪的,有人说它是一个运行在用户桌面的加热器,有人说它是桌面宠物,有人说它是张牙舞爪的机器人。但是没有人对于Konfabulator的描述是确切的。
4. 终于在2003年2月10日的深夜,Konfabulator1.0正式版在Rose和Perry的共同努力下正式发布了。它是运行在苹果操作系统之上的小工具,其中的主运行文件叫做Widget,在Rose头脑中酝酿了5年的想法终于第一次问世了。并且向所有人宣布Konfabulator是运行在用户桌面上最独一无二的工具,你希望它是什么样子,它就能按照你的想法而改变。 5. Konfabulator意想不到的快速在全美疯狂的蔓延着,Rose和Perry感到非常的吃惊,同时他们也认识到这将会成为Konfabulator发展历史上非常关键的一个时期,于是两个人都辞去了各自的工作,开始专注于Konfabulator这件事情。
6. 在2003年的7月Konfabulator1.5版本发布了,主运行文件Widget的开发变得风靡一时,越来越多的人参与其中,也因为如此Konfabulator更名为Widget。Widget在苹果操作系统中所表现出的热潮,使得Rose和Perry认为它应该有更广的应用领域。于是在接下的半年中Perry的一个朋友参与到开发Widget Windows平台版本的工作中来,但最开始的一些尝试都是失败的。


7. 不久之后Rose找到了一个自己的好朋友ED,ED是苹果电脑公司工作超过十年有着深厚资历的一名优秀的开发工程师。在和他沟通Windows平台下开发Widget的事情之后,ED认为Rose希望在Windows平台下运行Widget的想法有些不可理喻。Rose和Perry开始很失望,但令他们感到吃惊的是,两天以后ED居然拿出了一个Windows平台下运行的Widget原型。
8. 2004年的11月Widget1.8版本正式对外发布了,由此开始Widget进入了一个新的时代,成为了跨平台的产品。使用Windows和Mac操作系统的用户都可以使用和开发自己喜欢的Widget工具。当然这还仅仅只是一个开端。
使用「Yahoo!Widget工具」需要的计算机系统:
Yahoo!Widget工具在Windows和MacOS X上都可执行。 Windows:等级需为Windows 2000 Service Pack 3 或以上版本或Windows XP SP1或以上版本。 Macintosh:等级则需为Mac OS X 10.3 或以上版本。 内存需求为512MB以上,使用宽带网络不小于512k的计算机系统。

Widget的各种应用
(1)桌面Widget:
Yahoo! Widget:
Windows Vista侧边栏 :
(2)个性化首页Widgets
Netvibes
iGoogle
(3)博客Widgets
博客侧边栏(blogspot)
抓虾Widget


如何在Android手机上开发出Android应用

AppCan是国内首个HTML5移动应用在线开发平台,广大开发者可以在AppCan平台上简单、快速、高效的免费开发HTML5移动应用。AppCan基于HTML5跨平台特性,开发者只需开发一次即可适配iOS、Android、Symbian三大智能平台。AppCan提供三种应用开发模式,分别是EASY模式、WEB模式、NATIVE模式,以满足不同的开发水平和开发需求。EASY模式EASY模式是AppCan推出的在线智能模板式解决方案,开发者使用EASY模式中提供的模板,可简单快捷的制作出属于您自己的个性化手机应用。甚至你可以简单的使用Android手机登陆AppCan的网站,在小小手机屏幕上进行跨平台应用的开发。当然如果你的移动设备是iPad的话,那么开发起来会更方面一些。最终,它可以生成iOS、Android、Symbian三大平台的应用包。据闻Windows Phone的跨平台支持正在紧锣密鼓的开发中。你可以通过网站中生成的二维码连接,快速的将应用下载到你的手机上,进行真机调试。

Android开发教程是怎样的?

参加Android开发培训的同学都会先了解Android开发教程是怎样的,下面介绍Android开发要学习并掌握的知识有:Java基础、Linux基础、数据库基础、网络协议、Android基础、服务器端开发等。北大青鸟认为最重要的是最后的项目实训。Java基础零基础自学的同学刚开始一定会觉得Android开发当然要先从Android开始学习。然而,并不是这样的。Android开发基础是Java,所以Java基础一定要打扎实,才能更好地进一步学习。Java需要掌握的知识有:Java基础语法及设计模式。Linux基础Android系统以Linux系统为基础。开发过程中,要用到某些Linux命令,因此要掌握Linux基础。数据库基础学起来就很简单了;接着是网络协议,HTTP协议和Socket协议是必须掌握的;然后是Android基础。服务器端开发大多Android应用都需要服务器端的支持,因此服务器端开发内容也是必须要掌握的。服务器端分为很多种类:1.JavaEE:优点是功能完整、强大。2.PHP:简单易学,开发快速。3.NET:特点与JavaEE类似。4.rubyonrails:简洁,优雅是它的优点。寥寥几行代码,即能够实现非常复杂的功能,不过要有Ruby语言基础才行。项目实训为什么建议大家参加Android开发培训,而不是自学,自学能做项目吗,不可能!Android开发培训老师一定会带着做几个项目,团队协作,几类项目经验,这是自学学不来的,项目实训非常重要。

如何设置 android.support.design.widget.tablayout的选择的文本进行加粗显示

1.首先导入库:
compile 'com.android.support:appcompat-v7:23.1.1'
compile 'com.android.support:design:23.1.1'
compile 'com.android.support:support-v4:23.1.1'

2. 然后就是 布局文件

<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".TabLayoutActivity">

<android.support.design.widget.TabLayout
android:id="@+id/tl_tabs"
style="@style/MyCustomTabLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>

<android.support.v4.view.ViewPager
android:id="@+id/vp_viewpager"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:background="@android:color/white"/>

3. 这里将TabLaoyut的样式设置放入到了style文件中了,颜色神马的就不贴了
如果在布局中使用属性, 带tab开头的属性使用"app:"前缀而不是"andorid:"前缀




@color/colorPrimary
@color/colorPrimaryDark
@color/colorAccent


@dimen/tab_max_width
?attr/colorAccent
5dp
12dp
12dp
?attr/selectableItemBackground
@style/MyCustomTabTextAppearance
?android:textColorPrimary


14sp
?android:textColorSecondary
false

36dp


4.然后就是Activity文件了
public class TabLayoutActivity extends AppCompatActivity {
private ViewPagerAdapter viewPagerAdapter;
private ViewPager viewPager;
private TabLayout tl;
private static final String POSITION = "position";

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_tablayout);
viewPager = (ViewPager) findViewById(R.id.vp_viewpager);
tl = (TabLayout) findViewById(R.id.tl_tabs);
}

@Override
protected void onResume() {
super.onResume();
viewPagerAdapter = new ViewPagerAdapter(getSupportFragmentManager());
viewPager.setAdapter(viewPagerAdapter);
tl.setupWithViewPager(viewPager); //ViewPager 和 TabLayout 关联
tl.setTabMode(TabLayout.MODE_SCROLLABLE); //用于多个TAB, Tablayout可以滚动
//更改TAB默认的文本布局,自定义TAB布局
for (int i = 0; i < tl.getTabCount(); i++) {
TabLayout.Tab tabAt = tl.getTabAt(i);
tabAt.setCustomView(viewPagerAdapter.getTabView(i));
}
viewPagerAdapter.notifyDataSetChanged();
}

@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putInt(POSITION, tl.getSelectedTabPosition());
}

@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
viewPager.setCurrentItem(savedInstanceState.getInt(POSITION));
}
}

5. 然后就是ViewPager的Adapter了
private class ViewPagerAdapter extends FragmentPagerAdapter {
int pageCount = 10;
private int color[] = new int[]{R.color.orange, R.color.green, R.color.red,
R.color.color_grays, R.color.color_red, R.color.color_black,
R.color.color_furvous, R.color.color_blue, R.color.color_green,R.color.color_orange
};

public ViewPagerAdapter(FragmentManager supportFragmentManager) {
super(supportFragmentManager);
}

@Override
public Fragment getItem(int position) {
return ViewPagerFragment.getInstance(position + 1, color[position]);
}

@Override
public int getCount() {
return pageCount;
}

@Override
public CharSequence getPageTitle(int position) {
// if (position == 4) {
// Drawable img = getResources().getDrawable(R.drawable.ic_one);
// img.setBounds(0, 0, img.getIntrinsicWidth(), img.getIntrinsicHeight());
// SpannableString sb = new SpannableString("Page" + (position + 1) + " ");
// ImageSpan imageSpan = new ImageSpan(img, ImageSpan.ALIGN_BASELINE);
// sb.setSpan(imageSpan, 0, 1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
// return sb;
// }else{
// return "Page" + (position + 1);
// }
return null; //如果采用自定义TAB布局,则这里返回null就可以了
}
//引入TAB自定义布局
public View getTabView(int position) {
View view = View.inflate(TabLayoutActivity.this, R.layout.tab_item, null);
TextView tv = (TextView) view.findViewById(R.id.tv);
ImageView iv = (ImageView) view.findViewById(R.id.iv);
tv.setText("Page" + (position + 1));
if (position == 5) {
iv.setVisibility(View.VISIBLE);
} else {
iv.setVisibility(View.GONE);
}
return view;
}
}

6.然后可能重要的就是Fragment了

public class ViewPagerFragment extends BaseFragment {
public int page;
private int color;
public static final String GETPAGE = "get_page";
public static final String GETCOLOR = "get_color";
private static List frags = new ArrayList();
private View rootView;
public static Fragment getInstance(int page, int color) {
ViewPagerFragment cacheFrag = null;
cacheFrag = getCacheFrag(page, cacheFrag);
if (cacheFrag != null){
return cacheFrag; //首先尝试获取缓存的Fragment
}

Bundle args = new Bundle();
args.putInt(GETPAGE, page);
args.putInt(GETCOLOR, color);
//new 一个Fragment
ViewPagerFragment pageFragment = new ViewPagerFragment();
pageFragment.setArguments(args);
frags.add(pageFragment);
return pageFragment;
}
//获取缓存的Fragment
private static ViewPagerFragment getCacheFrag(int page, ViewPagerFragment cacheFrag) {
if (frags != null && frags.size() > 0){
for (ViewPagerFragment frag : frags){
if (frag.page == page){
cacheFrag = frag;
break;
}
}
}
return cacheFrag;
}

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
page = getArguments().getInt(GETPAGE);
color = getArguments().getInt(GETCOLOR);
}

@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
Log.i(this.getClass().getSimpleName(), "onCreateView");
if(rootView == null) {
rootView = inflater.inflate(R.layout.layout_fragment, container, false);
TextView tv = (TextView) rootView.findViewById(R.id.tv_fragment);
tv.setText("Page=====>" + page);
rootView.setBackgroundResource(color);
}
//缓存的rootView需要判断是否已经被加过parent, 如果有parent需要从parent删除,
//要不然会发生这个rootview已经有parent的错误。
ViewGroup parent = (ViewGroup) rootView.getParent();
if (parent != null){
parent.removeView(rootView);
}
return rootView;
}
}


知识相关

知识推荐

求职简历网为你分享个人简历、求职简历、简历模板、简历范文等求职简历知识。

Copyrights 2018-2024 求职简历网 All rights reserved.