[转载]Flash Builder4.5 + BladeDS + Java 集成实例

mikel阅读(1256)

[转载]Flash Builder4.5 + BladeDS + Java 集成实例 – 2012 – 博客园.

这两天调研一个基于Flex的一个项目和JAVA的集成相关问题,网上有一些资料,不过版本不太一样,而且描述不是很全。

本文把这些内容总结一下,并把例子代码放到了网站上。

Flex是和Silverlight竞争的技术,之所以选择Flex,是由于项目的已经积累基于Flex的内容,后续的项目为了利用和发展因此在这个基础上继续进行。

工具、下载列表和安装
Eclipse 3.6.1 eclipse-jee-helios-SR2-win32.zip

http://www.eclipse.org/downloads/download.php?file=/technology/epp/downloads/release/helios/SR2/eclipse-jee-helios-SR2-win32.zip

BladeDS 3 http://opensource.adobe.com/wiki/display/blazeds/Downloads

http://flexorg.wip3.adobe.com/blazeds/3.0.x/20776/blazeds-bin-3.3.0.20776.zip

Tomcat 6 http://apache.etoak.com/tomcat/tomcat-6/v6.0.32/bin/apache-tomcat-6.0.32-windows-x86.zip
Flash Builder 4.5 http://d.subject.csdn.net/fd_a.php?f=FlashBuilder_4_LS10.exe

安装步骤:

Eclipse tomcat 软件解压到约定的目录即可运行;Flash Builder安装即可

安装完成后,运行$**\Adobe\Adobe Flash Builder 4.5\utilities\Adobe Flash Builder 4.5 Plug-in Utility.exe 安装eclipse的插件

实例

建立Web项目

其他的步骤和http://www.horochovec.com/2010/03/29/flash-builder-flex-sdk-4-java-blazeds-tutorial/ 设置一样,把blazeDS的内容加入到这个项目中,修改web.xml,添加Java类实现服务

image

建立Flex项目

类似如下建立Flex项目

image

其他的参考:http://www.horochovec.com/2010/03/29/flash-builder-flex-sdk-4-java-blazeds-tutorial/ 设计页面和服务端的交互

只要设置了正确的路径可以直接Debug 这些Flex和Java项目,参考如下:

image

以上的代码参考:

http://cid-56b433ad3d1871e3.office.live.com/self.aspx/.Public/Flex-blazeDs-java-sample.rar

参考:

http://www.horochovec.com/2010/03/29/flash-builder-flex-sdk-4-java-blazeds-tutorial/

[转载]js图片延迟加载如何实现

mikel阅读(888)

[转载]js图片延迟加载如何实现 – 新志 – 博客园.

这里延迟加载的意思是,拖动滚动条时,在图片出现在浏览器显示区域后才加载显示。

大概的实现方式是:

在页面的load没有触发之前,把所有的指定id的元素内的img放入到imgs中,将所有的图片的src值放入到一个新建的_src属性中,把src设置为指定的显示图片。

然后,在document.body的scroll事件触发时,循环计算imgs中的img元素位置是否正好在浏览器显示框范围内,如果是,则将img元素的_src属性的值赋给src,这样图片就能显示出来。

这里比较麻烦地方是,如何计算img的位置,获得元素的相对于页面的绝对位置。通常是用offsetLeft和offsetTop,但这两个属性是 元素的offsetParent指向的元素的相对位置, 如果offsetParent所指的元素是设置了浮动的或使用绝对定位,那么offsetLeft来获得绝对位置就不正确呢。

在这里我是将元素的所有父级元素的offsetTop之和来获得文档绝对位置的。

1         //取元素的页面绝对 X位置
 2         var getLeft = function(El){
 3             var left = 0;
 4             do{
 5                 left += El.offsetLeft;
 6             }while((El = El.offsetParent).nodeName != 'BODY');
 7             return left;
 8         };
 9         //取元素的页面绝对 Y位置
10         var getTop = function(El){
11             var top = 0;
12             do{
13                 top += El.offsetTop;
14             }while((El = El.offsetParent).nodeName != 'BODY');
15             return top;
16         };

在设置窗口的scroll事件时,ie使用是document.documentElement,而其他的浏览器都使用document。

接下来是要获得浏览器显示窗口现对于文档的位置,用了下面的代码来计算

1 //读取滚动条的位置和浏览器窗口的显示大小
2             var top = isGoo ? document.body.scrollTop : document.documentElement.scrollTop,
3                 left = isGoo ? document.body.scrollLeft :document.documentElement.scrollLeft,
4                 width = document.documentElement.clientWidth,
5                 height = document.documentElement.clientHeight;

谷歌浏览器要通过body来获得scrollTop,而其他浏览器通过documentElement。

最后迭代判断img的位置,并显示图片

//对所有图片进行批量判断是否在浏览器显示区域内
for(var i=0 ; i < imgs.length; i++){ var _top = getTop(imgs[i]),_left = getLeft(imgs[i]); //判断图片是否在显示区域内 if( _top >= top &&
_left >= left &&
_top <= top+height && _left <= left+width){ var _src = imgs[i].getAttribute('_src'); //如果图片已经显示,则取消赋值 if(imgs[i].src !== _src){ imgs[i].src = _src; } } } [/js]

[转载]250多个Jquery各式各样的插件

mikel阅读(1184)

[转载]250多个Jquery各式各样的插件 – 黑客很黑 – 博客园.

收藏250多个JQuery插件,包括文件上传,表单验证,表单选取框,输入框,日期,时间,颜色选取,投票,搜索,编辑器,多媒体,视频,flash,图片相关,google地图,游戏,表格,统计图,边框,圆角,背景,文字和超链接,鼠标提示和菜单导航,幻灯特效和翻转,拖放插件,XML,JSON,浏览器,对话框,确认框,CSS,AJAX以及一些其它的JQuery插件。

文件上传(File upload)
Ajax File Upload .
jQUploader .
Multiple File Upload plugin .
jQuery File Style .
Styling an input type file .
Progress Bar Plugin .

表单验证(Form Validation)
jQuery Validation .
Auto Help .
Simple jQuery form validation .
jQuery XAV – form validations .
jQuery AlphaNumeric .
Masked Input .
TypeWatch Plugin .
Text limiter for form fields .
Ajax Username Check with jQuery .

表单-选取框(Form – Select Box stuff)
jQuery Combobox .
jQuery controlled dependent (or Cascadign) Select List .
Multiple Selects .
Select box manipulation .
Select Combo Plugin .
jQuery – LinkedSelect
Auto-populate multiple select boxes .
Choose Plugin (Select Replacement) .

表单基本、输入框、选择框等(Form Basics, Input Fields, Checkboxes etc.)
jQuery Form Plugin .
jQuery-Form .
jLook Nice Forms .
jNice .
Ping Plugin .
Toggle Form Text .
ToggleVal .
jQuery Field Plugin .
jQuery Form’n Field plugin .
jQuery Checkbox manipulation .
jTagging .
jQuery labelcheck .
Overlabel .
3 state radio buttons .
ShiftCheckbox jQuery Plugin .
Watermark Input .
jQuery Checkbox (checkboxes with imags) .
jQuery SpinButton Control .
jQuery Ajax Form Builder .
jQuery Focus Fields .
jQuery Time Entry .

时间、日期和颜色选取(Time, Date and Color Picker)
jQuery UI Datepicker .
jQuery date picker plugin .
jQuery Time Picker .
Time Picker .
ClickPick .
TimePicker .
Farbtastic jQuery Color Picker Plugin .
Color Picker by intelliance.fr .

投票插件(Rating Plugins)
jQuery Star Rating Plugin .
jQuery Star Rater .
Content rater with ASP.NET, ajax and jQuery .
Half-Star Rating Plugin .

搜索插件(Search Plugins)
jQuery Suggest .
jQuery Autocomplete .
jQuery Autocomplete Mod .
jQuery Autocomplete by AjaxDaddy .
jQuery Autocomplete Plugin with HTML formatting .
jQuery Autocompleter .
AutoCompleter (Tutorial with PHP&MySQL) .
quick Search jQuery Plugin .

编辑器(Inline Edit & Editors)
jTagEditor .
WYMeditor .
jQuery jFrame .
Jeditable – edit in place plugin for jQuery .
jQuery editable .
jQuery Disable Text Select Plugin .
Edit in Place with Ajax using jQuery .
jQuery Plugin – Another In-Place Editor .
TableEditor .
tEditable – in place table editing for jQuery .

多媒体、视频、Flash等(Audio, Video, Flash, SVG, etc)
jMedia – accessible multi-media embedding .
JBEdit – Ajax online Video Editor .
jQuery MP3 Plugin .
jQuery Media Plugin .
jQuery Flash Plugin .
Embed QuickTime .
SVG Integration .

图片(Photos/Images/Galleries)
ThickBox .
jQuery lightBox plugin .
jQuery Image Strip .
jQuery slideViewer .
jQuery jqGalScroll 2.0 .
jQuery – jqGalViewII .
jQuery – jqGalViewIII .
jQuery Photo Slider .
jQuery Thumbs – easily create thumbnails .
jQuery jQIR Image Replacement .
jCarousel Lite .
jQPanView .
jCarousel .
Interface Imagebox .
Image Gallery using jQuery, Interface & Reflactions .
simple jQuery Gallery .
jQuery Gallery Module .
EO Gallery .
jQuery ScrollShow .
jQuery Cycle Plugin .
jQuery Flickr .
jQuery Lazy Load Images Plugin .
Zoomi – Zoomable Thumbnails .
jQuery Crop – crop any image on the fly .
Image Reflection .

Google地图(Google Map)
jQuery Plugin googlemaps .
jMaps jQuery Maps Framework .
jQmaps .
jQuery & Google Maps .
jQuery Maps Interface forr Google and Yahoo maps .
jQuery J Maps – by Tane Piper .

游戏(Games)
Tetris with jQuery .
jQuery Chess .
Mad Libs Word Game .
jQuery Puzzle .
jQuery Solar System (not a game but awesome jQuery Stuff) .

表格等(Tables, Grids etc.)
UI/Tablesorter .
jQuery ingrid .
jQuery Grid Plugin .
Table Filter – awesome! .
TableEditor .
jQuery Tree Tables .
Expandable “Detail” Table Rows .
Sortable Table ColdFusion Costum Tag with jQuery UI .
jQuery Bubble .
TableSorter .
Scrollable HTML Table .
jQuery column Manager Plugin .
jQuery tableHover Plugin .
jQuery columnHover Plugin .
jQuery Grid .
TableSorter plugin for jQuery .
tEditable – in place table editing for jQuery .
jQuery charToTable Plugin .
jQuery Grid Column Sizing .
jQuery Grid Row Sizing .

统计图(Charts, Presentation etc.)
jQuery Wizard Plugin.
jQuery Chart Plugin .
Bar Chart .

边框、圆角、背景(Border, Corners, Background)
jQuery Corner .
jQuery Curvy Corner .
Nifty jQuery Corner .
Transparent Corners .
jQuery Corner Gallery .
Gradient Plugin .

文字和超链接(Text and Links)
jQuery Spoiler plugin .
Text Highlighting .
Disable Text Select Plugin .
jQuery Newsticker .
Auto line-height Plugin .
Textgrad – a text gradient plugin .
LinkLook – a link thumbnail preview .
pager jQuery Plugin .
shortKeys jQuery Plugin .
jQuery Biggerlink .
jQuery Ajax Link Checker .

鼠标提示(Tooltips)
jQuery Plugin – Tooltip .
jTip – The jQuery Tool Tip .
clueTip .
BetterTip .
Flash Tooltips using jQuery .
ToolTip .

菜单和导航(Menus, Navigations)
jQuery Tabs Plugin – awesome!. [demo nested tabs .]
another jQuery nested Tab Set example (based on jQuery Tabs Plugin) .
jQuery idTabs .
jdMenu – Hierarchical Menu Plugin for jQuery .
jQuery SuckerFish Style .
jQuery Plugin Treeview .
treeView Basic .
FastFind Menu .
Sliding Menu .
Lava Lamp jQuery Menu .
jQuery iconDock .
jVariations Control Panel .
ContextMenu plugin .
clickMenu .
CSS Dock Menu .
jQuery Pop-up Menu Tutorial .
Sliding Menu .
http://stilbuero.de/jquery/tabs_3/

幻灯、翻转等(Accordions, Slide and Toggle stuff)
jQuery Plugin Accordion .
jQuery Accordion Plugin Horizontal Way .
haccordion – a simple horizontal accordion plugin for jQuery .
Horizontal Accordion by portalzine.de .
HoverAccordion .
Accordion Example from fmarcia.info .
jQuery Accordion Example .
jQuery Demo – Expandable Sidebar Menu .
Sliding Panels for jQuery .
jQuery ToggleElements .
Coda Slider .
jCarousel .
Accesible News Slider Plugin .
Showing and Hiding code Examples .
jQuery Easing Plugin .
jQuery Portlets .
AutoScroll .
Innerfade .

拖放插件(Drag and Drop)
UI/Draggables .
EasyDrag jQuery Plugin .
jQuery Portlets .
jqDnR – drag, drop resize .
Drag Demos .

XML XSL JSON Feeds
XSLT Plugin .
jQuery Ajax call and result XML parsing .
xmlObjectifier – Converts XML DOM to JSON .
jQuery XSL Transform .
jQuery Taconite – multiple Dom updates .
RSS/ATOM Feed Parser Plugin .
jQuery Google Feed Plugin .

浏览器(Browserstuff)
Wresize – IE Resize event Fix Plugin .
jQuery ifixpng .
jQuery pngFix .
Link Scrubber – removes the dotted line onfocus from links .
jQuery Perciformes – the entire suckerfish familly under one roof .
Background Iframe .
QinIE – for proper display of Q tags in IE .
jQuery Accessibility Plugin .
jQuery MouseWheel Plugin .

对话框、确认窗口(Alert, Prompt, Confirm Windows)
jQuery Impromptu .
jQuery Confirm Plugin .
jqModal .
SimpleModal .
CSSjQuery Style Switcher .
JSS – Javascript StyleSheets .
jQuery Rule – creation/manipulation of CSS Rules .
jPrintArea .

DOM、AJAX和其它jQuery插件(DOM, Ajax and other jQuery plugins)
FlyDOM .
jQuery Dimenion Plugin .
jQuery Loggin .
Metadata – extract metadata from classes, attributes, elements .
Super-tiny Client-Side Include Javascript jQuery Plugin .
Undo Made Easy with Ajax .
JHeartbeat – periodically poll the server .
Lazy Load Plugin .

[转载]Android中文合集 最终版

mikel阅读(1295)

[转载]Android中文合集 最终版 – 农民伯伯 – 博客园.

前言

本合集包含Android 141章节的API和12篇开发者指南,包含以往历次发布的合集内容。Android中文翻译组是一个非盈利性质的开源组织,聚一批开发人员、大学生、研究生等Android爱好者,利用业余时间对Android相关的API及开发者指南等进行翻译,至今已超过200人报名参与,欢迎加入,联系Mailover140@gmail.com关于翻译组的更多介绍,请看这里

声明

欢迎转载,但请保留文章原始出处:)

博客园:http://www.cnblogs.com/

Android中文翻译组:http://goo.gl/6vJQl

正文

一、截图

二、介绍

本次合集采用客户端为载体,模拟chm界面风格整理并发布。主要特点为可自动更新内容,因此本客户端可合集的终极版本,以后不再发布chm格式的合集,下面是关于客户端的一些介绍:

2.1  特点介绍

2.1.1  自动更新内容

软件启动时,客户端会检测是否联网,在联网的情况下再检测是否有新的内容可更新,有的话就直接下载到本地缓存。

2.1.2  与chm格式比较

同样具备chm的离线使用能力。不必像以往一样需要等一个月才能有新的合集,也能减少多个版本的合集导致的混乱问题。同样也没有chm打不开的问题(少量用户反映)。方便修补误翻、漏翻的内容。

2.1.3  整合资源

右上角图标方便展示译者介绍、博客以及示例代码下载、在线中文地址、WORD原稿下载。

2.2  使用方法

2.2.1  准备

客户端需要Microsoft .NET Framework 2.0,WIN7的朋友不需要安装,XP可能需要,点这里下载安装。

2.2.2  下载客户端zip包(文章末尾),解压到任意目录,双击AndroidBox.exe运行即可。经常使用的话可以右键AndroidBox.exe快捷方式到桌面,甚至是启动项。

2.2.3  关闭

点击客户端右上角关闭按钮默认操作是隐藏到右下角,右键右下角客户端图标,退出即可。

2.2.4  更新

内容更新是无提醒模式自动进行更新,下载到本地;客户端更新为自动检测,检测到更新情况下提示用户操作。

2.2.5  信箱

图中3的位置,有内容更新时会显示黄色小灯的图标,点开可以看到更新的章节内容,可直接链接查看。

2.3  兼容系统

Windows XP (32bit / 64bit)

Windows 7 (32bit / 64bit)

Windows Server 2003 (32bit)

三、共享

无论你是个人还是团队,不管是否加入我们,如果翻译Android官方相关文章,请与我们分享进度,把你翻译的章节发邮箱到over140@gmail.com ,以免重复翻译。我们的进度:这里(以“进度_”开头的Excel文件)。

四、招募组员

文档翻译员,要求:

1. 有耐心,这是一场持久战,需要大家的坚持。

2. 有态度,认真对待每一篇译稿。

3. 会英语,至少在翻译工具的帮助下能读懂英文原文。

[]审核员,要求:

1.  脾气好,审稿过程中需要和组员沟通,需要好脾气来沟通。

2.  技术好,工作经验2年以上,Android经验半年以上,对技术有自己的理解。

3.  英语好,英语6级以上,有相关翻译经验更佳。


五、 下载

AndroidBox-Beta0.3.zip

结束

客户端虽功能不多,但业余开发时间仍然非常紧张,有BUG还请大家及时反馈到over140@gmail.com,感谢大家支持。虽然我们翻译整理速度很慢,但每个脚印都是有价值,相信开源的力量!

[转载]tudou(土豆)、youku(优酷)API(有相应的dll [C#])

mikel阅读(1584)

[转载]tudou(土豆)、youku(优酷)API(有相应的dll [C#]) – SeaSunK – 博客园.

相信网上有不少的相关介绍;

先说一下怎么获取tudou的视频:

先给一个官方API,注:需要登录:

登录后去到我的应用,没的当然要创建了,主要是为了拿appkey

imageimageimage

我归纳一下:

土豆的视频分三类(普通、豆单、剧集),可以从他们提供的API里可清晰知道;

image

开发文档栏有具体说明;

普通视频的URL是这样的:www.tudou.com/programs/view/xSGVQG5Vi_M/或者www.tudou.com/programs/view/M9Ke35fBnDk/?tid=-1&aid=12667&pid=41010111&oid=100173&isNielson=0

而它的AP要求是这样的

image

主要是图中的itemCode;很幸运:普通的视频URL里就可以知道这个itemcode,聪明的你一看就知道了,就是跟在/view/__ 后面的,如上面URL里的xSGVQG5Vi_MM9Ke35fBnDk,这两个都是itemcode;

为什么上面说幸运呢,因为豆单的和剧集的就没那么好运了!在2011-06-01(呃。。。今天是6.1哦~~)为止,我还没有看到能够直接通过它的API直接拿到相关的信息;(豆单与剧集是列表形式的视频);

看下列表视频的URL:www.tudou.com/playlist/p/l12302700.html或者http://www.tudou.com/playlist/p/a66454i82719708.html或者http://www.tudou.com/playlist/p/a66506.html

说到这里,他们的API估计还没做好,因为我发现点问题,看图:

image

看绿色的框框,他们提供的API里一个是写着playlistid,而示例则是playlistCode,重点是如果API是不包括playlistCode的话根本是访问不通的,会提示

4001 : Required String parameter ‘playlistCode’ is not present

image

那这个playlistCode怎么拿到呢??(注:是最原始的URL,就是上面给的那些URL例子,因为在视频里的分享我们是可以拿到playlistCode,后面我会讲一下)

后来我查看了所有的API都没办法,因为最基本的需要就是playlistCode;

最后实在没办法了,就用了最原始的方法(分析其网页原码了,然后用正则匹配出来),后来看了原码后发现都提供了itemcode了,所以我就直接拿这个itemcode挺不是更好,也不用要拿playlistCode后还要定位某个视频(因为是列表啊);

image

拿到这个itemCode后就可以利用普通视频的API来拿相关信息了,测试结果还是挺理想的,当然这样就会向tudou请求两次了;

请求它的API时format选择了JSON,结果:

[json]
{“multiResult”:{“results”:[{“description”:”test”,”tags”:”test”,”itemId”:1000232,”channelId”:1,”mediaType”:”视频”,”totalTime”:20100,”pubDate”:”2006-04-27″,”title”:”test”,”picUrl”:”http://i1.tdimg.com/001/000/232/p.jpg”,”itemUrl”:”http://www.tudou.com/programs/view/yg8CVootoAc/”,”itemCode”:”yg8CVootoAc”,”ownerName”:”yumihhh”,”ownerNickname”:”yumihhh”,”outerPlayerUrl”:”http://www.tudou.com/v/yg8CVootoAc/v.swf”,”ownerId”:262809,”picChoiceUrl”:[“http://image2.tudou.com/data/imgs/i/001/000/232/m15.jpg”,”http://image2.tudou.com/data/imgs/i/001/000/232/m30.jpg”],”secret”:false}]}}
[/json]

上面提到的分享拿playlistCode

image

如果有人能知道列表视频的直接API,请告诉我,谢谢~~

youku的其实差不多

如果想通过youku官方提供的API就不可行了,因为我看了也是要APPKEY,关键是要合作方的,没免费注册~~或许我没看到吧,反正找不到;

不过我知道一个入口是:

http://v.youku.com/player/getPlayList/VideoIDS/XMjcxOTg0NTcy

注意这个XMjcxOTg0NTcy

youku的分类:

普通:http://v.youku.com/v_show/id_XMjcxOTU3OTk2.html

列表:http://v.youku.com/v_playlist/f6164011o1p0.html

列表的我还是通过分析其网页的原码拿这个VideoId;

image

贴个youku的代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Net;
using System.Text;
using System.Text.RegularExpressions;

namespace DCC.UI.Common
{
public class YouKuApiHelper
{
private string videoApiUrl = "http://v.youku.com/player/getPlayList/VideoIDS/{0}";
private string _url;
public YouKuApiHelper(string url)
{
this._url = url;
}

private bool GetVideoId(ref string videoId)
{
Regex regShow = new Regex(@"^http:\/\/v\.youku\.com\/v_show\/id_([\w\d+_-]*)\.html|^http:\/\/v\.youku\.com\/v_show\/id_([\w\d+_-]*)=\.html", RegexOptions.IgnoreCase);
Match mShow = regShow.Match(_url);
if (mShow.Success)
{
videoId = mShow.Groups[1].Value;//Groups[0]為整個匹配對象(這裡是_url),Groups[1]才是第一個括號裡匹配的
return true;
}
else
{
Regex regList = new Regex(@"^http:\/\/v\.youku\.com\/v_playlist", RegexOptions.IgnoreCase);
if (regList.IsMatch(_url))
{
try
{
WebClient webClient = new WebClient();
string youkuHtml = Encoding.ASCII.GetString(webClient.DownloadData(_url));
Regex regHtml = new Regex(@"(?is)var\s+(videoId2)+?\s*=\s*'([\w-]+)'\s*;", RegexOptions.IgnoreCase);
Match mHtml = regHtml.Match(youkuHtml);
if (mHtml.Success)
{
videoId = mHtml.Groups[2].Value;
return true;
}
}
catch (Exception ex)
{
return false;
}
}
}
return false;
}
///
/// 根據youku的視頻URL分析再請求其API獲取視頻信息
///
///
public string GetVideoInfo()
{
try
{
string videoId = string.Empty;
if (GetVideoId(ref videoId))
{
WebClient webClient = new WebClient();
string videoInfo = Encoding.ASCII.GetString(webClient.DownloadData(string.Format(videoApiUrl, videoId)));
return videoInfo;
}
else
{ return "error"; }
}
catch (Exception ex)
{
return "error";
}
}
}

tudou Api源码下载(VS2010)

[转载]首页优化-图片延迟加载

mikel阅读(960)

[转载]首页优化-图片延迟加载 – zaohe – 博客园.

简介:

为了提高用户体验,多图片的长页面需要使用延迟加载技术,对这方面的论述,Kissy中有很经典的论述,感兴趣的朋友可以去这里了解一下(http://docs.kissyui.com/kissy/docs/datalazyload/index.html),我先简单的介绍一下,然后讨论如何改进并用于项目中。

分析:

1. Img 更换 src方案:<img data-ls-src=”真正的路径”,src=”load图片的路径”/>

优点:实现简单,不更改页面Dom结构。

缺点:图片数量大时,效率不够好;ie6ie7下替换SRC时有Bug存在。

2. textarea 延迟方案:

优点:JS效率高,分块加载

缺点:需要更改Dom结构,需要限定textarea包围区域的高度宽度,使用不够方便。

3. Kissy的实现方式:1,2两种方案都支持

1-1 延迟加载示例图

如上图所示,加载图片时有一个阀值,所有阀值以上的图片全部加载。

优点:实现简单

缺点:对一些用户行为支持不够,例如用户直接将滚动条拉到页面底部。

4. 首页分析 (lp.taobao.com)

1) 首页的长度比较长 4000*1000 以上

2) 分块展示,分为10块,1个首屏,2个滚屏,7个通用楼层

3) 每个分块比较短,不超过一屏

5. 首页延迟方案:

1) 分块加载图片

2) 滚屏中,在切换帧时触发加载

实现:

1) 打开页面,默认只显示首屏。

2) 当滚动条滚动到当前分块时(可以附加一些像素,是图片提前加载),加载当前分块

3) 7个楼层添加额外的优化,因为是同一种实现,提供一个管理器,当用户在某一个楼层上停留时间超过5秒,即可以加载未加载的楼层。

总结:

在首页的延迟加载优化过程中,尝试过多种方式。

1) 最初使用的是Kissy默认的替换src方案,发现在ie下,用户刷新页面时,会定位到上次滚动到得位置,此时用户体验特别差;

2) 尝试过textarea方案,UI体验也不好;

3) 改进了kissy的方案,不使用阀值,而是只在用户视图区域内加载图片,无法分块控制;

4) 最后分块加载图片,同时也处理了楼层初始化

改进的kissy方案和分块延迟加载的代码,连同对其的单元测试一起在后面的博客中会跟大家讨论。

[转载]移动开发的三块重大技术点

mikel阅读(940)

[转载]移动开发的三块重大技术点 – 徐文兵 – 博客园.

1 2d 3d 图片和动画实现

2D图片:

2d 图像的绘制和显示

2d图像的二次处理 和显示

3d 动画

3d动画的播放

3d游戏引擎选择和sdk学习

3d游戏引擎的开发(如有机会在公司层面有资源提供)

基于3d动画引擎的事件捕捉,事件处理

2 基于终端的多媒体固件设备的API访问

语音:

调用API,打开麦克风,录制语音,并保存声音文件

对语音文件进行格式转换

播放指定的语音

对语音进行基于网络的传输

图像

调用API,打开终端的摄像头,设置摄像头参数,并获取图片,并保存图片格式。

对图片文件进行格式转化

浏览图片

对图片进行基于网络的传输

视频:

调用api,打开摄像头,设置摄像头得参数,获取视频文件,并按照一定格式保存

对视频文件进行格式转化

浏览并播放视频

对视频文件进行基于网络的传输

3 实现Android系统自带基础功能(如类似网络电话)

前一段了解了一个应用 网络电话

这个应用实现的功能是,用户拨打其他用户电话时,在对方电话也是智能手机且也有网络电话应用时,直接转化成网络电话通话,这样直接避开电信运行商,同时在用户体验上和直接打电话又没有太多的区别

对于这样一些应用要求,对于开发者要关注于以下几个方面

l  对原Android系统基础功能实现的了解

l  了解Android 提示方式

l  线程编程

l  网络服务接口互动

[转载]android实战系统二Android网络互动传输方案选择和实现

mikel阅读(821)

转载android实战系统二Android网络互动传输方案选择和实现 – 徐文兵 – 博客园.

前言:

在前面介绍过基于对话框形式,实现登陆和注册账号,没有细说Android终端和互联网的服务之间的交互实现,

在下面我将说明在在选择Android传输的方案选型分析过程,登陆和注册接口定义和实现.

1  android传输方案分析和选型

在谈到android 传输方案,一般大家想到的就是 Socket传输,基于http的web服务,还有直接是http的post,get获取方式。

接下来是从 【网络实现条件】,【使用范围】, 【传输优缺点】, 【传输数据格式】,【综合开发成本】,【应用复杂度】等角度分析这三种传输方式,做为选择的判断条件。

下面是我对这三种传输方式的分析。

Socket传输 Web服务 Post,get获取数据方式
网络实现条件 端口:特定端口

协议:TCP,UDP

(目前无线网络非80端口的支持度低。目前移动梦网只支持wap和http协议)

端口 80

协议是http

端口 80

协议是http

使用范围 数据量大,格式简单,且实时性要求高的传输 标准的Web服务接口,接口固定 http形式,接口固定
传输优缺点 速度快,数据量小 速度一般,数据量大 速度一般,数据量一般
传输格式 自定义数据格式 SOAP Json
开发要求 客户端和服务器端:数据拼接,解析,数据完整验证

开发人员技术要求高

客户端:使用第三方web服务组件,拼接参数,解析回馈数据,过程复杂。

服务器端:创建web服务

开发人员技术要求:一般

客户端:直接调用android自带的json包解析json数据。过程简单

服务器端:生成基于httpHandler的ashx文件接口

开发人员的技术要求:低

综合成本 一般

综合以上分析:选择json+httphandler 的传输方式

2 登陆和注册两个接口实现

2.1 登陆接口实现

接口定义

http://192.168.1.1/gointel/UserHandler.ashx?Action=login&Account=xuwenbing&PassWord=xuwenbing

反馈的json格式:

{ActionResult:false,Reason:””账号和密码不一致””}

源码:


/*用户登陆
* 服务器检测用户的账号和密码是否一致,并返回结果
* */
public static Boolean Login(String Account ,String PassWord)
{
//Step One  从服务器接口中获取当前账号和密码的配对情况
Boolean actionResult=false;
String httpUrl="http://221.181.127.43/gointel/UserHandler.ashx?Action=login&amp;Account="+Account+"&amp;PassWord="+PassWord;
//httpGet 连接对象
HttpGet httpRequest =new HttpGet(httpUrl);

try
{
//取得HttpClinet对象
HttpClient httpclient=new DefaultHttpClient();

// 请求HttpClient,取得HttpResponse
HttpResponse  httpResponse=httpclient.execute(httpRequest);

//请求成功
if(httpResponse.getStatusLine().getStatusCode()==HttpStatus.SC_OK)
{
//取得返回的字符串
String strResult=EntityUtils.toString(httpResponse.getEntity());

JSONObject jsonObject = new JSONObject(strResult) ;
//获取返回值,并判断是否正确
actionResult=jsonObject.getBoolean("ActionResult");
}
}
catch(Exception e)
{
return false;

}
return actionResult;
}

2.2 注册接口实现

接口定义:

http://192.168.1.1/gointel/UserHandler.ashx?Action=register&Account=xuwenbing&PassWord=xxuwenbin&NiceName=ninilan;

反馈json格式:

{ActionResult:false,Reason:””用户名已存在””}

源码:


public static Boolean Register(String account, String passWord,
String niceName) {

Boolean actionResult=false;
String httpUrl="http://221.181.127.43/gointel/UserHandler.ashx?Action=register&Account="+account+"&PassWord="+passWord+"&NiceName="+niceName;
//httpGet 连接对象
HttpGet httpRequest =new HttpGet(httpUrl);

try
{
//取得HttpClinet对象
HttpClient httpclient=new DefaultHttpClient();

// 请求HttpClient,取得HttpResponse
HttpResponse httpResponse=httpclient.execute(httpRequest);

//请求成功
if(httpResponse.getStatusLine().getStatusCode()==HttpStatus.SC_OK)
{
//取得返回的字符串
String strResult=EntityUtils.toString(httpResponse.getEntity());

JSONObject jsonObject = new JSONObject(strResult) ;

//获取返回值,并判断是否正确
actionResult=jsonObject.getBoolean("ActionResult");
}
}
catch(Exception e)
{
return false;

}
return actionResult;
}

[转载]利用Callback=xml 绕过OAuth 验证,免去xAuth的申请

mikel阅读(1568)

[转载][05.24] 利用Callback=xml 绕过OAuth 验证,免去xAuth的申请 – akita – 博客园.

以前一直用 BasicAuth 作验证,不过 Sina 声明从六月份开始正式停止对 BasicAuth 的支持,因为保密性能太差,的确,谁也不希望自己的用户名和密码一直在天上飘来飘去,被拦截已经不是时间问题,而是必然的了。

然 而 Oauth 对我们这种小型爱好者有一个问题就是需要到网页端去点击那个确认授权,可是我们是可以让用户在软件内输入用户名密码的。虽然这样还是会让我(也就是第三方 软件提供方)直接接触到用户的用户名密码,但是我个人认为作为客户端可能这样是无可避免的,这也牵涉到一个用户信任度的问题,不然难道 Sina 要直接提供在线 TextBox 输入功能么。。。

不要偏题,本文重点不在OAuth的验证过程,那么接下来简单说明下 OAuth 的流程:

1.第三方服务商用自己的 key 和 secret 向服务器发起申请,获得 request token 这个 token 和用户没有任何关联,仅仅是服务商和 sina 沟通的结果;

2.第三方服务商根据 request token 将用户导向 Sina 提供的授权页面,一个 Web 页面(这个是重点,我们就是要绕过这一步,没人愿意在自己的软件里面转为Oauth验证添加一个 WebBrowser Control);

3.用户在 Web 页面中输入了用户名密码并授权后,页面执行 Callback,callback 的地址已经包含了一个 oauth verifier,可以看做用户授权证书;

4.第三方服务商带着第一步获取的 request token 和 第三步获取的 verifier 再次向 Sina 服务器发起申请,现在你将获得一个 access token,也就是通行证了。

好 阐述完毕 oAuth 的验证过程后,我们发现移动客户端中如果不借助 Basic Auth 和 xAuth(复杂的申请流程),很难在无页面导向的情况下获得 access token,网上查阅了很多资料,Android 就是使用了一个 webview 控件,其他平台要么就是申请 xAuth 要么就是网页形式,他们忽略了 Sina 很人性化的一个 callback = json/xml 的功能。

详细说明下这个问题,第三步中,如果 我们直接以sina 的页面导向形式 request 需要的 uri (类似 http://api.t.sina.com.cn/oauth/authorize?oauth_token={0}& oauth_callback={1})那么你获得的 response 肯定是一个 html 的页面。但是,Sina 的 authority API 提供了一个很tricky的功能(http://open.t.sina.com.cn/wiki/index.php/Oauth/authorize?retcode=0

简单说,如果你用(http://api.t.sina.com.cn/oauth/authorize?oauth_token={0}&oauth_callback=xml&userId= {1}&passwd={2})这个 Path 去 request Sina 的服务器,神奇的事情就发生了,返回会直接是一个 xml 格式的 callback,其中包含 token 和 verifier,接下来的事情就跟上面第四步一样咯,嘿嘿,绕过页面的感觉是不是很爽,不知道 Sina 会不会取消这样的 callback 因为毕竟这样还是会有一次需要用 userid 和 passwd 作为参数传递出去的,等于还是裸奔了一段。大家自己判断吧。(json 方式大概相同,就不说了。)

[转载]C# 新浪微博群发器

mikel阅读(944)

[转载]C# 新浪微博群发器 – FMN – 博客园.

通过新浪微博api群发微博,使用了sina提供的sdk,并对其进行小改,跳过了oauth页面认证。这个sdk用起来挺方便的。下面介绍实现方法,给有这方面需要的一个参考。

由于跳过了oauth页面认证,需要发送一次用户密码,不够安全,大家应该酌情使用。

我小改的sdk下载地址,将下载下来的文件夹复制到项目中:http://files.cnblogs.com/fmnisme/sinaApi.rar

sina官方文档中心:http://open.weibo.com/wiki/index.php/%E9%A6%96%E9%A1%B5

绕过oauth页面认证的方法使用了博客园akita 的方法,在此感谢,关于该方法的博客:http://www.cnblogs.com/btxakita/archive/2011/05/24/2055767.html

skd使用方法:

首先修改SDK中GlobalInfo类的appkey,appSecret为你在sina申请到的appKey,appSecret;

var httpRequest = HttpRequestFactory.CreateHttpRequest(Method.GET) as HttpGet;
//因为群发博客,所以用数组存放了用户信息,x代表数组下标。
                httpRequest.GetRequestToken();
                string url = httpRequest.GetAuthorizationUrl();
                GlobalInfo.requestTokens[x] = httpRequest.Token;
                GlobalInfo.requesTokenSecrets[x] = httpRequest.TokenSecret;
                httpRequest.GetVerifier(“用户名[x]”,“密码[x]”x); 
                httpRequest.GetAccessToken();
                GlobalInfo.requestTokens[x] = httpRequest.Token;
                GlobalInfo.requesTokenSecrets[x] = httpRequest.TokenSecret;
                var sendUrl = "http://api.t.sina.com.cn/statuses/update.xml?";
                httpRequest2.Request(sendUrl, "status=" + HttpUtility.UrlEncode(“微博内容”));

下面贴出代码:


using System;
using System.Collections.Generic;
using System.Windows.Forms;
using System.IO;
using LeoShi.Soft.OpenSinaAPI;
using System.Web;
using System.Threading;

读取配置文件并获取相应的accessToken,配置文件的格式为:username&password,每个这样的占一行,使用记事本写就行了。

private void btn_readIni_Click(object sender, EventArgs e)
{
if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
txt_filePath.Text = openFileDialog1.FileName;
}

if (txt_filePath.Text != “”)
{
FileStream fs = new FileStream(txt_filePath.Text, FileMode.Open, FileAccess.Read);
StreamReader sr = new StreamReader(fs);
while(!sr.EndOfStream)
{
string str = sr.ReadLine();;
if (str == “”)
continue;
string[] strArr = str.Split(‘&’);
userInfoList.Add(new string[2] {strArr[0].Trim(),strArr[1].Trim()});
}
sr.Close();
fs.Close();
}
btn_send.Enabled = false;
initSina();
btn_send.Enabled = true;
lb_status.Text = “成功连接微博,初始化完成”;
}

private void initSina()
{
for (int x = 0; x < userInfoList.Count; x++) { if (userInfoList[x][0]=="") break; var httpRequest = HttpRequestFactory.CreateHttpRequest(Method.GET) as HttpGet; httpRequest.GetRequestToken(); string url = httpRequest.GetAuthorizationUrl(); GlobalInfo.requestTokens[x] = httpRequest.Token; GlobalInfo.requesTokenSecrets[x] = httpRequest.TokenSecret; httpRequest.GetVerifier(userInfoList[x][ 0], userInfoList[x][ 1],x); httpRequest.GetAccessToken(); GlobalInfo.requestTokens[x] = httpRequest.Token; GlobalInfo.requesTokenSecrets[x] = httpRequest.TokenSecret; } } [/csharp] 发送微博: [csharp] private void btn_send_Click(object sender, EventArgs e) { Thread sendWeiboThread = new Thread(new ThreadStart(sendWeibo)); sendWeiboThread.Start(); } private void sendWeibo() { Thread.CurrentThread.IsBackground = true; Control.CheckForIllegalCrossThreadCalls = false; btn_send.Enabled = false; btn_readIni.Enabled = false; for (int m = 0; m < int.Parse(txt_sendTimes.Text); m++) { times++; for (int x = 0; x < userInfoList.Count; x++) { lb_status.Text = userInfoList[x][0] + " " + x.ToString() + "/" + userInfoList.Count; var httpRequest2 = HttpRequestFactory.CreateHttpRequest(Method.POST); httpRequest2.Token = GlobalInfo.requestTokens[x]; httpRequest2.TokenSecret = GlobalInfo.requesTokenSecrets[x]; var sendUrl = "http://api.t.sina.com.cn/statuses/update.xml?"; httpRequest2.Request(sendUrl, "status=" + HttpUtility.UrlEncode(txt_weibo.Text + " " + times.ToString())); Thread.Sleep(150); } } btn_send.Enabled = true; btn_readIni.Enabled = true; lb_status.Text = "发送完成。"; } [/csharp]