首页 文章 精选 留言 我的

精选列表

搜索[ui],共10002篇文章
优秀的个人博客,低调大师

Web UI - Browse Hadoop Services

141.6.1.Cluster and Apps Information (ResourceManager) http://localhost:8088 141.6.2.NodeManager Information http://localhost:8042 141.6.3.Hadoop Overview of NameNode service http://localhost:50070 141.6.4.Hadoop file system browsing (Directory Browse) http://localhost:50070/explorer.html 原文出处:Netkiller 系列 手札 本文作者:陈景峯 转载请与作者联系,同时请务必标明文章原始出处和作者信息及本声明。

优秀的个人博客,低调大师

Android UI学习 - FrameLayou和布局优化

FrameLayout 先来看官方文档的定义:FrameLayout是最简单的一个布局对象。它被定制为你屏幕上的一个空白备用区域,之后你可以在其中填充一个单一对象 — 比如,一张你要发布的图片。所有的子元素将会固定在屏幕的左上角;你不能为FrameLayout中的一个子元素指定一个位置。后一个子元素将会直接在前一个子元素之上进行覆盖填充,把它们部份或全部挡住(除非后一个子元素是透明的)。 我的理解是,把FrameLayout当作画布canvas,固定从屏幕的左上角开始填充图片,文字等。看看示例,原来可以利用 android:layout_gravity来设置位置的: <?xmlversion="1.0"encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent"> <ImageView android:id="@+id/image" android:layout_width="fill_parent" android:layout_height="fill_parent" android:scaleType="center" android:src="@drawable/candle" /> <TextView android:id="@+id/text1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:textColor="#00ff00" android:text="@string/hello" /> <Button android:id="@+id/start" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="bottom" android:text="Start" /> </FrameLayout> 效果图 布局优化 使用tools里面的hierarchyviewer.bat来查看layout的层次。在启动模拟器启动所要分析的程序,再启动hierarchyviewer.bat,选择模拟器以及该程序,点击“Load View Hierarchy”,就会开始分析。可以save as png。 <merge>减少视图层级结构 从上图可以看到存在两个FrameLayout,红色框住的。如果能在layout文件中把FrameLayout声明去掉就可以进一步优化布局代码了。 但是由于布局代码需要外层容器容纳,如果 直接删除FrameLayout则该文件就不是合法的布局文件。这种情况下就可以使用<merge> 标签了。 修改为如下代码就可以消除多余的FrameLayout了: <?xmlversion="1.0"encoding="utf-8"?> <mergexmlns:android="http://schemas.android.com/apk/res/android"> <ImageView android:id="@+id/image" android:layout_width="fill_parent" android:layout_height="fill_parent" android:scaleType="center" android:src="@drawable/candle" /> <TextView android:id="@+id/text1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:textColor="#00ff00" android:text="@string/hello" /> <Button android:id="@+id/start" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="bottom" android:text="Start" /> </merge> <merge>也有一些使用限制: 只能用于xml layout文件的根元素;在代码中使用LayoutInflater.Inflater()一个以merge为根元素的 布局文件时候,需要使用 View inflate (int resource, ViewGroup root, boolean attachToRoot)指定一个ViewGroup 作为其容器,并且要设置attachToRoot 为true。 <include>重用layout代码 如果在某个布局里面需要用到另一个相同的布局设计,可以通过<include> 标签来重用layout代码: <?xmlversion="1.0"encoding="utf-8"?> <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> <includeandroid:id="@+id/layout1"layout="@layout/relative"/> <includeandroid:id="@+id/layout2"layout="@layout/relative"/> <includeandroid:id="@+id/layout3"layout="@layout/relative"/> </LinearLayout> 效果图 这里要注意的是, "@layout/relative"不是引用Layout的id,而是引用res/layout/relative.xml,其内容是前面文章介绍RelativeLayout的布局代码。 另外,通过<include>,除了可以覆写id属性值,还可以修改其他属性值,例如android:layout_width,android:height等。 <viewstub> 延迟加载 (转自 http://rainhomepage.appspot.com/2010/01/use-viewstub-to-optimize-the-layout-of) ViewStub 是一个不可见的,大小为0的View,最佳用途就是实现View的延迟加载,在需要的时候再加载View,可Java中常见的性能优化方法延迟加载一样。 当调用ViewStub的setVisibility函数设置为可见或则调用 inflate初始化该View的时候,ViewStub引用的资源开始初始化,然后引用的资源替代ViewStub自己的位置填充在ViewStub的 位置。因此在没有调用setVisibility(int) 或则 inflate()函数之前 ViewStub一种存在组件树层级结构中,但是由于ViewStub非常轻量级,这对性能影响非常小。 可以通过ViewStub的inflatedId属性来重新定义引用的layout id。 例如: <ViewStubandroid:id="@+id/stub" android:inflatedId="@+id/subTree" android:layout="@layout/mySubTree" android:layout_width="120dip" android:layout_height="40dip"/> 上面定义的ViewStub ,可以通过id “stub”来找到,在初始化资源“mySubTree”后,stub从父组件中删除,然后"mySubTree"替代stub的位置。初始资源"mySubTree"得到的组件可以通过inflatedId 指定的id "subTree"引用。 然后初始化后的资源被填充到一个120dip宽、40dip高的地方。 推荐使用下面的方式来初始化ViewStub: ViewStubstub=(ViewStub)findViewById(R.id.stub); Viewinflated=stub.inflate(); 当调用inflate()函数的时候,ViewStub 被引用的资源替代,并且返回引用的view。 这样程序可以直接得到引用的view而不用再次调用函数 findViewById()来查找了。 ViewStub目前有个缺陷就是还不支持 <merge /> 标签。 layoutopt (Layout Optimization工具) 这工具可以分析所提供的Layout,并提供优化意见。在tools文件夹里面可以找到layoutopt.bat。 用法: layoutopt <list of xml files or directories> 参数: 一个或多个的Layout xml文件,以空格间隔;或者多个Layout xml文件所在的文件夹路径 例子: layoutopt G:\StudyAndroid\UIDemo\res\layout\main.xml layoutopt G:\StudyAndroid\UIDemo\res\layout\main.xml G:\StudyAndroid\UIDemo\res\layout\relative.xml layoutopt G:\StudyAndroid\UIDemo\res\layout 本文转自 Icansoft 51CTO博客,原文链接: http://blog.51cto.com/android/308090

优秀的个人博客,低调大师

[UI]实用案例--Shape绘制实用圆圈

Android允许通过xml定义资源,常见的事string,id,integer,dimen等,也可以定义一些图片资源,比如用来做几何的矢量图就非常好用,其中有许多的细节问题,具体需求可以再结合google 的文档:http://developer.android.com/guide/topics/resources/drawable-resource.html#Shape 碰到好几次这个需求,干脆写篇短文记录一下,源码直接可用。 案例:app内经常会需要一些icon标识当前有新的系统提示,或则新的短信 实现: shape可以绘制矩形环形以及椭圆,所以只需要用椭圆即可,在使用的时候将控件比如imageview或textview的高宽设置成一样就是正圆,solid表示远的填充色,stroke则代表远的边框线,所以两者结合可以实现带边缘的圆,当然也可以直接加上size控制高宽,下面的代码实现效果是一个带白边的红圆。 <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval" android:useLevel="false"> <solidandroid:color="@color/red"/> <stroke android:width="1dp" android:color="@color/white"/> <sizeandroid:width="20dp" android:height="20dp"/> </shape> 本文转自SharkBin博客园博客,原文链接: http://www.cnblogs.com/SharkBin/p/4886039.html ,如需转载请自行联系原作者

优秀的个人博客,低调大师

IOS学习——UI基础UIWindow、UIView(五)

在PC中,应用程序多是使用视窗的形式显示内容,手机应用也不例外,手机应用中要在屏幕上显示内容首先要创建一个窗口承载内容,iOS应用中使用UIWindow、UIView来实现内容显示。 UIWindow: UIWindow对象是所有UIView的根视图,管理和协调的应用程序的显示、分发事件给View。UIWindow类是UIView的子类,可以看作是特殊的UIView。一般应用程序只有一个UIWindow对象,即使有多个UIWindow对象,也只有一个UIWindow可以接受到用户的触屏事件。UIWindow初始化在appDeleDgate里面的 didFinishLaunchingWithOptions方法。 self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease]; // Override point for customization after application launch. self.window.backgroundColor = [UIColor whiteColor]; [self.window makeKeyAndVisible];//显示出UIWindow UIView: UIView类继承自UIResponder,负责在屏幕上 定义一个矩形区域,视图用于展示界面及响应用户界面交互。每个视图对象都要负责渲染视图区域的内容,并响应该区域中发生的操作事件。 除了显示内容和处理事件之外,视图可以嵌套并管理子视图。子视图是指嵌入到另一视图对象内部的视图对象,而被嵌入的视图对象是父视图。视图添加到window中就会显示出来,iOS中是怎么实现视图显示的,看下面的代码: - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease]; // Override point for customization after application launch. self.window.backgroundColor = [UIColor whiteColor]; CGRect rect=[UIScreen mainScreen].applicationFrame; NSLog(@"NSScreen application %@",NSStringFromCGRect(rect)); CGRect rect2=[UIScreen mainScreen].bounds; NSLog(@"NSString mainScreen %@",NSStringFromCGRect(rect2)); NSLog(@"iOS_didFinishLaunchingWithOptions"); UIView *view1=[[UIView alloc]initWithFrame:CGRectMake(60, 50, 200, 100)]; view1.backgroundColor=[UIColor greenColor]; [self.window addSubview:view1]; [view1 release]; UIView *view2=[[UIView alloc]initWithFrame:CGRectMake(60, 100, 200, 200) ]; view2.alpha=0.5; view2.backgroundColor=[UIColor cyanColor]; [self.window addSubview:view2]; UIView *view3=[[UIView alloc]initWithFrame:CGRectMake(100, 50, 60, 50)]; view3.backgroundColor=[UIColor colorWithRed:25/255.0 green:60/255.0 blue:150/255.0 alpha:1.0]; [view2 addSubview:view3]; [view3 release]; [view2 release]; [self.window makeKeyAndVisible]; return YES; } 上面添加了三个视图,view1、view2、view3,view3嵌套在view2中。 /** * @author 张兴业 * http://blog.csdn.net/xyz_lmn * iOS入门群: 83702688 * android开发进阶群: 241395671 * 我的新浪微博: @张兴业TBOW */ 本文转自xyz_lmn51CTO博客,原文链接:http://blog.51cto.com/xyzlmn/1230735,如需转载请自行联系原作者

优秀的个人博客,低调大师

Android--UI之DatePicker、TimePicker...

前言 这一篇博客分别讲解Android平台下,关于日期和时间的几个相关控件。包括DatePicker(日期选择控件)、TimePicker(时间选择控件)、DatePickerDialog(日期选择对话框)、TimePickerDialog(时间选择对话框)、AnalogClock(模拟时钟控件)、DigitalClock(数字时钟控件)。对于时间控件,无非就是一个展示、修改、获取等操作,下面一一讲解。 DatePicker、TimePicker DatePicker、TimePicker都继承自android.widget.FrameLayout,并且默认展示风格、与操作风格也类似。DatePicker用于展示一个日期选择控件,TimePicker用于展示一个时间选择控件。 作为一个日期选择控件,DatePicker可以通过设置属性来确定日期选择范围,也可以通过定义好的方法获取到当前选中的时间,并且在修改日期的时候,有响应的事件对其进行响应。 DatePicker常用相关属性: android:calendarViewShown:是否显示日历。 android:startYear:设置可选开始年份。 android:endYear:设置可选结束年份。 android:maxDate:设置可选最大日期,以mm/dd/yyyy格式设置。 android:minDate:设置可选最小日期,以mm/dd/yyyy格式设置。 DatePicker的方法而言,除了常用获取属性的setter、getter方法之外,还需要特别注意一个初始化的方法init()方法,用于做DatePicker控件的初始化,并且设置日期被修改后,回调的响应事件。此方法的签名如下: init(int year, int monthOfYear, int dayOfMonth, DatePicker.OnDateChangedListener onDateChangedListener) 从上面的init()方法可以看到,DatePicker被修改时响应的事件是DatePicker.OnDateChangedListener事件,如果要响应此事件,需要实现其中的onDateChanged()方法,其中参数从签名即可了解意思,这里不再累述。 onDateChanged(DatePicker view, int year, int monthOfYear, int dayOfMonth) 作为一个时间选择控件来说,TimePicker需要与时间相关的getter、setter方法之外,还需要有时间被修改够,回调的响应事件。 TimePicker常用方法有如下几个: is24HourView():判断是否为24小时制。 setIs24HourView():设置是否为24小时制显示。 getCurrentXxx():获取当前时间。 setCurrentXxx():设置当前时间。 setOnTimeChangedListener():设置时间被修改的回调方法。 TimePicker控件被修改的回调方法,通过setOnTimeChangedListener()方法设置,其传递一个TimePicker.OnTimeChangedListener接口,需要实现其中的onTimeChanged()方法。 下面通过一个示例来讲解这两个控件的使用,在示例中分别展示了这两个控件,并在其修改之后,把修改值通过Toast的方式展示到屏幕上。 布局代码: 1 <?xml version="1.0" encoding="utf-8"?> 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 android:layout_width="match_parent" 4 android:layout_height="match_parent" 5 android:orientation="vertical" > 6 7 <DatePicker 8 android:id="@+id/dpPicker" 9 android:calendarViewShown="false" 10 android:layout_width="match_parent" 11 android:layout_height="wrap_content" /> 12 13 <TimePicker 14 android:id="@+id/tpPicker" 15 android:layout_width="match_parent" 16 android:layout_height="wrap_content" /> 17 18 19 </LinearLayout> 实现代码: 1 package com.bgxt.datatimepickerdemo; 2 3 import java.text.SimpleDateFormat; 4 import java.util.Calendar; 5 6 import android.app.Activity; 7 import android.os.Bundle; 8 import android.widget.DatePicker; 9 import android.widget.DatePicker.OnDateChangedListener; 10 import android.widget.TextView; 11 import android.widget.TimePicker; 12 import android.widget.Toast; 13 14 public class DataTimePicker extends Activity { 15 private DatePicker datePicker; 16 private TimePicker timePicker; 17 18 @Override 19 protected void onCreate(Bundle savedInstanceState) { 20 super.onCreate(savedInstanceState); 21 setContentView(R.layout.activity_datatimepicker); 22 23 datePicker = (DatePicker) findViewById(R.id.dpPicker); 24 timePicker = (TimePicker) findViewById(R.id.tpPicker); 25 26 datePicker.init(2013, 8, 20, new OnDateChangedListener() { 27 28 @Override 29 public void onDateChanged(DatePicker view, int year, 30 int monthOfYear, int dayOfMonth) { 31 // 获取一个日历对象,并初始化为当前选中的时间 32 Calendar calendar = Calendar.getInstance(); 33 calendar.set(year, monthOfYear, dayOfMonth); 34 SimpleDateFormat format = new SimpleDateFormat( 35 "yyyy年MM月dd日 HH:mm"); 36 Toast.makeText(DataTimePicker.this, 37 format.format(calendar.getTime()), Toast.LENGTH_SHORT) 38 .show(); 39 } 40 }); 41 42 timePicker.setIs24HourView(true); 43 timePicker 44 .setOnTimeChangedListener(new TimePicker.OnTimeChangedListener() { 45 @Override 46 public void onTimeChanged(TimePicker view, int hourOfDay, 47 int minute) { 48 Toast.makeText(DataTimePicker.this, 49 hourOfDay + "小时" + minute + "分钟", 50 Toast.LENGTH_SHORT).show(); 51 } 52 }); 53 54 } 55 } 效果展示: DatePickerDialog、TimePickerDialog DatePickerDialog、TimePickerDialog是两个对话框控件,一个弹出对话框用于选择日期,一个弹出对话框用于选择时间,都继承自android.app.AlertDialog。 这两个控件的开发过程,其主要就是开发其选择后日期或时间后,相应的事件。 对于DatePickeDialog而言,通过构造函数可以设置弹出的日期控件的初始值,并且可以指定选中日期后,回调事件的实现,构造函数的签名如下: DatePickerDialog(Context context, DatePickerDialog.OnDateSetListener callBack, int year, int monthOfYear, int dayOfMonth) 其中DatePickerDialog.OnDateSetListener为日期选中的响应事件,其他为日期弹出窗口初始化的日期,对于一个OnDateSetListener接口而言,需要实现其中的onDateSet()方法,在这个方法内,可以得到用户选中的日期。 对于TimePickerDialog而言,同样可以通过构造函数设置初始值,并且设定选中日期后,回调事件的实现,构造函数的签名如下: TimePickerDialog(Context context, TimePickerDialog.OnTimeSetListener callBack, int hourOfDay, int minute, boolean is24HourView) 其中TimePickerDialog.OnTimeSetListener为时间选中的响应事件,其他为时间弹出窗口初始化的时间,对于一个OnTimeSetListener接口而言,需要实现其中的onTimeSet()方法,在这个方法内,可以得到用户选中的时间。 AnalogClock、DigitalClock AnalogClock、DigitalClock为两个时间展示控件,切只是展示的风格不同而已,没有什么太大的区别。有一点值得注意的就是,这两个控件展示的时间是无法修改的,仅为系统当前时间。看示例就能明白,没什么好详细说的。 下面通过一个例子说明一下DatePickerDialog、TimePickerDialog、AnalogClock、DigitalClock四个控件的使用。 布局代码: 1 <?xml version="1.0" encoding="utf-8"?> 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 android:layout_width="match_parent" 4 android:layout_height="match_parent" 5 android:orientation="vertical" > 6 7 <TextView 8 android:layout_width="fill_parent" 9 android:layout_height="wrap_content" 10 android:text="指针时钟:" /> 11 12 <AnalogClock 13 android:layout_width="fill_parent" 14 android:layout_height="wrap_content" /> 15 16 <TextView 17 android:layout_width="fill_parent" 18 android:layout_height="wrap_content" 19 android:text="数字时钟:" /> 20 21 <DigitalClock 22 android:layout_width="fill_parent" 23 android:layout_height="wrap_content" 24 android:textSize="20dp" /> 25 <Button 26 android:id="@+id/btnTimePickerDialog" 27 android:layout_width="fill_parent" 28 android:layout_height="wrap_content" 29 android:text="Show TimePickerDialog" 30 /> 31 <Button 32 android:id="@+id/btnDatePickerDialog" 33 android:layout_width="fill_parent" 34 android:layout_height="wrap_content" 35 android:text="Show DatePickerDialog" 36 /> 37 </LinearLayout> 实现代码: 1 package com.bgxt.datatimepickerdemo; 2 3 import android.app.Activity; 4 import android.app.DatePickerDialog; 5 import android.app.DatePickerDialog.OnDateSetListener; 6 import android.app.TimePickerDialog; 7 import android.app.TimePickerDialog.OnTimeSetListener; 8 import android.os.Bundle; 9 import android.view.View; 10 import android.view.View.OnClickListener; 11 import android.widget.Button; 12 import android.widget.DatePicker; 13 import android.widget.TimePicker; 14 import android.widget.Toast; 15 16 public class AnalogDigitalClock extends Activity implements OnClickListener { 17 private Button btnDate, btnTime; 18 19 @Override 20 protected void onCreate(Bundle savedInstanceState) { 21 super.onCreate(savedInstanceState); 22 setContentView(R.layout.activity_anologdigital); 23 btnDate = (Button) findViewById(R.id.btnDatePickerDialog); 24 btnTime = (Button) findViewById(R.id.btnTimePickerDialog); 25 btnDate.setOnClickListener(this); 26 btnTime.setOnClickListener(this); 27 } 28 29 @Override 30 public void onClick(View v) { 31 switch (v.getId()) { 32 case R.id.btnDatePickerDialog: 33 DatePickerDialog datePicker=new DatePickerDialog(AnalogDigitalClock.this, new OnDateSetListener() { 34 35 @Override 36 public void onDateSet(DatePicker view, int year, int monthOfYear, 37 int dayOfMonth) { 38 // TODO Auto-generated method stub 39 Toast.makeText(AnalogDigitalClock.this, year+"year "+(monthOfYear+1)+"month "+dayOfMonth+"day", Toast.LENGTH_SHORT).show(); 40 } 41 }, 2013, 7, 20); 42 datePicker.show(); 43 break; 44 45 case R.id.btnTimePickerDialog: 46 TimePickerDialog time=new TimePickerDialog(AnalogDigitalClock.this, new OnTimeSetListener() { 47 48 @Override 49 public void onTimeSet(TimePicker view, int hourOfDay, int minute) { 50 // TODO Auto-generated method stub 51 Toast.makeText(AnalogDigitalClock.this, hourOfDay+"hour "+minute+"minute", Toast.LENGTH_SHORT).show(); 52 } 53 }, 18, 25, true); 54 time.show(); 55 break; 56 } 57 58 } 59 } 效果展示: 源码下载 总结 以上就讲解了在Android平台下,几个与时间相关的控件,没有什么特别的,注意设置与响应事件即可。 本文转自承香墨影博客园博客,原文链接:http://www.cnblogs.com/plokmju/p/android_DatePiceker.html,如需转载请自行联系原作者

优秀的个人博客,低调大师

Android优化——UI优化(四) 使用stytle

使用style替换背景,防止Activity黑色背景闪过 1.原来的布局 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@drawable/img_bg" android:orientation="horizontal"> <Button android:layout_weight="1" android:layout_width="0" android:layout_height="wrap_content" android:text="New Button" android:id="@+id/button2"/> <Button android:layout_weight="1" android:layout_width="0" android:layout_height="wrap_content" android:text="New Button1" android:id="@+id/button3"/> </LinearLayout> 这里我们用了android:background="@drawable/img_bg"来设置了背景图片,但是当我们启动activity是有时候会出现一个黑色的背景,然后才出现我们设置的背景,给用户感觉我们的程序运行的很慢 2.解决办法 <resources> <!-- Base application theme. --> <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar"> <!-- Customize your theme here. --> <item name="android:background">@drawable/img_bg</item> </style> </resources> 我们可以给主题设置一个背景,这样就不会给用户感觉我们的应用卡住了 3.知其然知其所以然 1.因为程序的主题是在程序启动的时候加载 2.Layout中设置的背景实在Activity启动之后才加载 所以会让用户看到一个黑色背景闪过的过程。 本文转自 一点点征服 博客园博客,原文链接: http://www.cnblogs.com/ldq2016/p/5226593.html ,如需转载请自行联系原作者

优秀的个人博客,低调大师

Salesforce为Marketing Cloud带来Lightning UI

Marketing Cloud已经迎来Lightning Experience,其将为CRM巨头的市场推广、销售与服务方案带来统一的视觉与使用体验。 Salesforce公司于本周二公布了其Marketing Cloud Lightning方案。 简而言之,Marketing Cloud已经得到Lightning Experience的全面增强,后者将为CRM巨头的市场推广、销售与服务方案带来统一的外观与使用体验。 Lightning Experience结合了Lightning平台上的多项组件,例如经过改进的用户体验、分析机制以及合作伙伴生态系统。 Lightning亦作为联网应用与物联网方案的战略起步品牌,Salesforce公司希望将其描述为“客户联网”。因此一系列专注于开发者的用户体验元素被纳入该公司的基础产品当中,包括Sales Cloud与Service Cloud。 Lightning品牌自2014年10月以来已经成为Salesforce生态系统中的重要组成部分。当时这家来自旧金山的企业刚刚公布其Salesforce Lightning框架,这套工具包旨在帮助开发者构建并定制移动应用。在此期间,Salesforce公司一直在逐步利用Lightning设计思路对其行业专用型云产品进行改造。 对于Marketing Cloud,Salesforce公司表示新的Lightning组件将允许开发人员创建并定制新的业务应用,同时添加多种核心邮件功能,包括追踪邮件打开率并自动预测客户行为的能力。 除了Lightning之外,Salesforce还公布了Marketing Cloud for Google Customer Match,即Salesforce与谷歌之间的最新合作产物。该项服务允许市场营销人员在谷歌搜索引擎、YouTube以及Gmail中部署CRM支持的广告宣传方案。 原文发布时间为:2016年5月12日 本文作者:作者:杨昀煦 本文来自云栖社区合作伙伴至顶网,了解相关信息可以关注至顶网。

优秀的个人博客,低调大师

Xcode 7 中的 UI 测试功能

回到 Xcode 4,测试 iOS 应用的唯一方式就是 OCUnit,其遗留了许多有待改进之处。Pivots 利用了它们在 行为驱动开发(behavior-driven development)框架中的专业观点着手创建它们自己的测试套件 - Cedar 诞生了. Cedar 是一个优秀的框架,用于创建 BDD 风格的测试,完全支持匹配器和伪装。而 Xcode 7 还没有完全的支持,Pivotal 在一个分支上跟进他们的工作,预计很快就会有东西要发布了。自从尝到 TDD 的甜头之后, 我使用 Cedar 测试过我所工作过的每一个 iOS 应用。我甚至开始把它用在功能测试控制器上,但那是下次的主题了。 单独使用 Cedar 不能给与我在使用 Ruby on Rails 时所日渐赞赏的端到端覆盖。我不能可靠地在几个屏幕之间进行触摸操作,让应用运作起来。可以理解的是,Cedar 并不用为那个而被创建出来的。为了填补这个空缺,许多玩家都已经创建了他们自己的第三方功能测试框架。 Frank, KIF, Subliminal, Apple 的 UIAutomation,我把他们都试了一遍。你要是希望了解更多可以访问我的故障特征测试框架。它不是开发者的失败,而是因为 Apple 对待测试只有有限的开放性。这使得这些框架有一系列的补丁,而在这些补丁之上,这些框架不外乎都成为了一堆破碎的工具。 没有涉及到的更多细节: Frank 一直被遗弃。 KIF 已经与主要的 iOS 修订版本决裂。 Subliminal 不能在命令行中可靠地运行。 UIAutomation 是用 JavaScript 和 clunky 写的。 我在 Pivotal 工作的时候,有六个分离的 app,我尝试对每个不同应用使用不同的框架。我甚至对 KIF 和 Frank 捐助,因为我希望这些框架成功。不幸地是,它们不可能离开 Apple 的支持。 文章转载自 开源中国社区 [http://www.oschina.net]

资源下载

更多资源
腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册