早在两年前,就有电子商务巨头将目光瞄准到手机应用,但由于受制于终端、带宽和支付的限制,终究有些“雷声大雨点小”。
近两年,iPhone、iPad 和Android 设备的出现彻底改变无线应用方式,加上电信运营商、第三方支付的移动支付业务日趋成熟,电子商务在无线互联网领域有望取得比PC端更广阔的前景。
让我们看看他们怎么说:
IDG资本副总裁李丰透露:手机上的B2C网站爱购网,每个月已经有几百万的流水;
凡客无线推出一个月后,每天订单数已达千;
京东商城无线业务负责人杨思勇称:2010年京东移动应用实现盈亏平衡,预计明年移动电子商务占总销售额的10%(约为10亿元);
淘宝无线事业部高级经理李磊分享了这样的数据:2010年每天有1000万用户通过手机访问淘宝,每天会产生1300万的交易金额(峰值为3700万),整年是18亿的交易金额,预计2011年能达到100亿的交易金额;
……
没错,移动电子商务正在火速地发展。
一、移动电子商务现状无论是从数字上来看,还是从社会化媒体上看到的讨论,移动电子商务正在兴起并火速发展是个不争的事实。
京东商城为什么要大力推进到移动互联网?这是因为他们看到了手机在京东商城上的火爆销售情况,意识到移动市场的高速发展和巨大潜力,同时京东移动客户端所增加的订单数量也证明了移动电子商务的市场潜力巨大。在美国,绝大部分的商铺和网站都已经有相对应的移动客户端。在中国,越来越多的传统品牌都会开始着手制作手机上的品牌客户端,导致移动互联网的加速发展。
让我们看看,谁在使用移动电子商务:
强PC用户
强PC用户群是指从PC端走向手机端的用户,这些用户主要在一二线城市,大部分人群为白领。他们逐渐开始适应并习惯使用智能手机的应用程序进行购买。
弱PC用户
弱PC用户群是指由于消费能力有限或很少使用PC的用户,他们对电子商务的认识可能直接就是从手机端开始的,数据显示该人群对手机的依赖性很高。这部分人群 的移动电子商务体验基本上都是从山寨机起步的,他们在此之前很少接触过PC网络,在繁忙的工作之余使用手机WAP网络来丰富自己的生活,当然包括网络购 物。
这两类用户购买的商品单价、品种都相差非常大。虽然强PC用户群有着更强大的购买力,但同时我们也不能忽视弱PC客户群给移动电子商务带来的影响。
立购网、爱购网和买卖宝(网站)都是主要通过服务这部分人群来获得大量订单的。
商家为什么大量涌入移动互联网领域?
二、If not now, when?商家为什么大量涌入移动互联网领域?概括说来有以下三个情况:
树立全新品牌(立购、Quick拍等)
拓宽渠道、增加收入(凡客、京东等)
形势所迫的跟随策略(屈臣氏、服装品牌等)(详情)
传统电子商务为什么要转移到移动平台?
增加收入是其最主要的驱动力
对用户零碎时间的争夺也决定了向移动平台业务转移的必然性
越来越多的店铺和网站都有自己的移动应用程序,他们的主要目的并不是为了增加收入,而是增加终端数量,扩大品牌影响力,展示和推广自己的商品。传统商家利用新的科技手段来宣传自己是一种市场行为,这意味着品牌的意识在不断觉醒。
搜索、LBS、二维码等与电子商务相结合的尝试带来了很多新的价值:这些工具和新应用可以借助线下场景,在用户最希望比价或者消费的时候提供优惠的消费选择;帮助卖家实现线上/线下营销一体化;电子商务从单一固定的PC端变身为随时随地的贴身服务。概括来说,实时、本地、动态和位置是移动互联网的四大基本特征。我们应该如何利用好这些特征来服务我们的消费者?让我们来看看目前国内移动电子商务方面的主要应用。
杀手级应用——比价
京东商城移动客户端的最大亮点是比价功能。用户通过扫描3C产品上面的条纹码,可以轻松的获得该产品在京东商城中的价格。这会使得一些线下商铺,如国美,苏宁的销售受到冲击,毕竟线下销售产品的价格会高于线上商铺。届时,我们会看到越来越多用户在实体商铺中体验产品,却在京东商城中购买产品。
我查查的比价功能主要集中在日常生活用品。通过扫描在超市中产品的条纹码,即可知道该产品在各个商场超市和网络超市中的价格。当发现网络超市中的价格远低于标签所示价格,用户可以选择一键下单功能,直接通过网络购买产品,之后只需在家等待送货上门即可,这同时也培养了用户的网络消费习惯。
同样,绝大部分商品都可以通过淘宝客户端进行比价。绝大部分用户对于价格还是相当敏感的,如果发现同样产品在淘宝上更低的报价,用户会转向淘宝进行购物。我们可以从移动淘宝2010年18个亿的销售额中看出,它把大量的本应该线下购物的用户转变为淘宝的用户。
冲动消费——一键下单
无线凡客,乐淘的手机应用程序使用大量制作精良的图片,惊险刺激的秒杀活动,便捷的下单功能来促使更多的用户产生冲动消费行为。当你不经意间产生了某种购物欲望,随时随地的移动客户端就会满足你的需求。
节省金钱——优惠卷
悦乐、[来吃啦][14]等手机应用程序会自动根据你所在的位置推荐附近的优惠卷信息、商铺的限时优惠信息、还提供信用卡合作商户的优惠信息。比起线下需要打印纸质优惠券的维洛城来说,更便捷,内容更加丰富。而且节约了硬件成本,并且绝对环保。
商铺推荐——点评
大众点评等手机应用程序会根据你在的位置自动推荐具有良好口碑的商户和网友对其的大量点评信息,让你对周围的餐厅、商店和娱乐场所了如指掌。大众点评还提供“口味最佳”、“环境最优”等一系列的检索排行榜,也提供了LBS的签到功能,方便查阅密友的跟踪去向和点评。
信息整合——二维码
Quick拍是利用二位码链接商品和购物网站,通过扫描二维码提供商品价格信息,并进行商品推荐。用户可以通过照片和二维码获得信息,避免麻烦的手动输入信息。二维码成为从现下内容走上线上的重要渠道,我们可以看到在很多公交车广告牌上都出现相应的二维码,一来用户可以与广告进行互动,再者商家可以调查该广告的实际效应。
鼓励进店——LBS
位基服务(Location-Based Service,LBS)应用实际上是实际场景的应用,提供了用户走入商铺的动力。现在更多的利用蓝牙、声音、WIFI等设备鼓励人们真正走入店铺,让潜在客户变为潜在消费客户。当然LBS还有组织活动,收集用户信息等其他功能。
激发新的需求——团购服务
团购让线下商铺突然和线上活动联系起来。团800的手机应用程序会按照地理位置进行团购推荐和点评,让团购真正的走到你的身边。
移动应用如果不好玩,不好看,不好用都会导致用户流失。目前移动电子商务所面对的困难还有很多,在商家、程序、体验、购买、支付、物流上都有问题需要解决 (知乎问答)。
传统商家的意识需要培养
不仅要培养用户,更要培养线下商家。
让线下商家更好的融入到这波新的移动互联网的浪潮中,很多商家对于移动互联网完全没有概念。
虽然团购改变了传统店铺和商家,但是还需要更深入的改变。需要提高商家的意识,移动互联网的意识,如何应用优惠卷促销的意识。
种类繁多的手机操作系统
终端的不统一,手机系统的不统一,屏幕的不统一,支付的不统一,这些都大大的增加了服务商成本和精力。
不过从好的方面来看,终端和系统的不统一是一个天然的壁垒,使得后来者难以推翻前者。手机是满足不同用户的不同需求,所以手机终端和系统是不会统一的。
过分比价
用户可以通过条形码扫描进行比价,这是用户的根本需求即获得更低价的商品。但是比价是最初级的竞争方式,如果用户对价格过分敏感,势必会摧毁整个产业,所以要逐渐引导用户关注价格之外的部分,如:配送,服务,售后等。
移动支付
目前移动支付拖了移动互联网的后腿,据我们了解各银行也都在推出。我们相信, 移动支付绝对不会成为电子商务的绊脚石。
物流问题
目前整个中国的物流系统存在着很多问题:速度慢,服务差,验货难,价格高等。不过随着像阿里巴巴这样的大企业的加入、国家政策的扶持、市场逐渐的扩大,物流也不会成为电子商务迅猛发展的阻碍。
我们不得不承认一件事实:将来我们在电脑前的时间越来越少,在手机前的时间越来越长。
种种迹象都在证明移动互联网在不久的将来会超过桌面互联网。移动互联网使得用户连接网络,发布信息,分享信息,获取信息的成本降低。移动电子商务是传统的电子商务的补充,LBS提供了一个身边的应用场景,二维码是传统媒体连接到互联网的一种途径,优惠和点评信息给移动互联网用户带来实际价值。
在信息繁杂的今天,“推送”用户所喜好的信息和产品将会成为未来的移动互联网的一个重要方向。纵观历史,我们可以发现互联网的发展有四个阶段:线下对线下,传统的信息交流;线下到线上,门户网站集中大量的信息和内容;线上对线上,Facebook和Twitter的崛起;现在需要思考的问题是:线上如何更好的服务线下?
原文地址:http://www.geekpark.net/read/view/116872
java字符串的各种编码转换
import java.io.UnsupportedEncodingException;
/**
* 转换字符串的编码
*/
public class ChangeCharset {
/** 7位ASCII字符,也叫作ISO646-US、Unicode字符集的基本拉丁块 */
public static final String US_ASCII = "US-ASCII";
/** ISO 拉丁字母表 No.1,也叫作 ISO-LATIN-1 */
public static final String ISO_8859_1 = "ISO-8859-1";
/** 8 位 UCS 转换格式 */
public static final String UTF_8 = "UTF-8";
/** 16 位 UCS 转换格式,Big Endian(最低地址存放高位字节)字节顺序 */
public static final String UTF_16BE = "utf-8BE";
/** 16 位 UCS 转换格式,Little-endian(最高地址存放低位字节)字节顺序 */
public static final String UTF_16LE = "utf-8LE";
/** 16 位 UCS 转换格式,字节顺序由可选的字节顺序标记来标识 */
public static final String UTF_16 = "utf-8";
/** 中文超大字符集 */
public static final String GBK = "GBK";
/**
* 将字符编码转换成US-ASCII码
*/
public String toASCII(String str) throws UnsupportedEncodingException{
return this.changeCharset(str, US_ASCII);
}
/**
* 将字符编码转换成ISO-8859-1码
*/
public String toISO_8859_1(String str) throws UnsupportedEncodingException{
return this.changeCharset(str, ISO_8859_1);
}
/**
* 将字符编码转换成UTF-8码
*/
public String toUTF_8(String str) throws UnsupportedEncodingException{
return this.changeCharset(str, UTF_8);
}
/**
* 将字符编码转换成utf-8BE码
*/
public String toUTF_16BE(String str) throws UnsupportedEncodingException{
return this.changeCharset(str, UTF_16BE);
}
/**
* 将字符编码转换成utf-8LE码
*/
public String toUTF_16LE(String str) throws UnsupportedEncodingException{
return this.changeCharset(str, UTF_16LE);
}
/**
* 将字符编码转换成utf-8码
*/
public String toUTF_16(String str) throws UnsupportedEncodingException{
return this.changeCharset(str, UTF_16);
}
/**
* 将字符编码转换成GBK码
*/
public String toGBK(String str) throws UnsupportedEncodingException{
return this.changeCharset(str, GBK);
}
/**
* 字符串编码转换的实现方法
* @param str 待转换编码的字符串
* @param newCharset 目标编码
* @return
* @throws UnsupportedEncodingException
*/
public String changeCharset(String str, String newCharset)
throws UnsupportedEncodingException {
if (str != null) {
//用默认字符编码解码字符串。
byte[] bs = str.getBytes();
//用新的字符编码生成字符串
return new String(bs, newCharset);
}
return null;
}
/**
* 字符串编码转换的实现方法
* @param str 待转换编码的字符串
* @param oldCharset 原编码
* @param newCharset 目标编码
* @return
* @throws UnsupportedEncodingException
*/
public String changeCharset(String str, String oldCharset, String newCharset)
throws UnsupportedEncodingException {
if (str != null) {
//用旧的字符编码解码字符串。解码可能会出现异常。
byte[] bs = str.getBytes(oldCharset);
//用新的字符编码生成字符串
return new String(bs, newCharset);
}
return null;
}
public static void main(String[] args) throws UnsupportedEncodingException {
ChangeCharset test = new ChangeCharset();
String str = "This is a 中文的 String!";
System.out.println("str: " + str);
String gbk = test.toGBK(str);
System.out.println("转换成GBK码: " + gbk);
System.out.println();
String ascii = test.toASCII(str);
System.out.println("转换成US-ASCII码: " + ascii);
gbk = test.changeCharset(ascii,ChangeCharset.US_ASCII, ChangeCharset.GBK);
System.out.println("再把ASCII码的字符串转换成GBK码: " + gbk);
System.out.println();
String iso88591 = test.toISO_8859_1(str);
System.out.println("转换成ISO-8859-1码: " + iso88591);
gbk = test.changeCharset(iso88591,ChangeCharset.ISO_8859_1, ChangeCharset.GBK);
System.out.println("再把ISO-8859-1码的字符串转换成GBK码: " + gbk);
System.out.println();
String utf8 = test.toUTF_8(str);
System.out.println("转换成UTF-8码: " + utf8);
gbk = test.changeCharset(utf8,ChangeCharset.UTF_8, ChangeCharset.GBK);
System.out.println("再把UTF-8码的字符串转换成GBK码: " + gbk);
System.out.println();
String utf16be = test.toUTF_16BE(str);
System.out.println("转换成utf-8BE码:" + utf16be);
gbk = test.changeCharset(utf16be,ChangeCharset.UTF_16BE, ChangeCharset.GBK);
System.out.println("再把utf-8BE码的字符串转换成GBK码: " + gbk);
System.out.println();
String utf16le = test.toUTF_16LE(str);
System.out.println("转换成utf-8LE码:" + utf16le);
gbk = test.changeCharset(utf16le,ChangeCharset.UTF_16LE, ChangeCharset.GBK);
System.out.println("再把utf-8LE码的字符串转换成GBK码: " + gbk);
System.out.println();
String utf16 = test.toUTF_16(str);
System.out.println("转换成utf-8码:" + utf16);
gbk = test.changeCharset(utf16,ChangeCharset.UTF_16LE, ChangeCharset.GBK);
System.out.println("再把utf-8码的字符串转换成GBK码: " + gbk);
String s = new String("中文".getBytes("UTF-8"),"UTF-8");
System.out.println(s);
}
}
------------------------------------------
java中的String类是按照unicode进行编码的,当使用String(byte[] bytes, String encoding)构造字符串时,encoding所指的是bytes中的数据是按照那种方式编码的,而不是最后产生的String是什么编码方式,换句话说,是让系统把bytes中的数据由encoding编码方式转换成unicode编码。如果不指明,bytes的编码方式将由jdk根据操作系统决定。
当我们从文件中读数据时,最好使用InputStream方式,然后采用String(byte[] bytes, String encoding)指明文件的编码方式。不要使用Reader方式,因为Reader方式会自动根据jdk指明的编码方式把文件内容转换成unicode编码。
当我们从数据库中读文本数据时,采用ResultSet.getBytes()方法取得字节数组,同样采用带编码方式的字符串构造方法即可。
ResultSet rs;
bytep[] bytes = rs.getBytes();
String str = new String(bytes, "gb2312");
不要采取下面的步骤。
ResultSet rs;
String str = rs.getString();
str = new String(str.getBytes("iso8859-1"), "gb2312");
这种编码转换方式效率底。之所以这么做的原因是,ResultSet在getString()方法执行时,默认数据库里的数据编码方式为iso8859-1。系统会把数据依照iso8859-1的编码方式转换成unicode。使用str.getBytes("iso8859-1")把数据还原,然后利用new String(bytes, "gb2312")把数据从gb2312转换成unicode,中间多了好多步骤。
从HttpRequest中读参数时,利用reqeust.setCharacterEncoding()方法设置编码方式,读出的内容就是正确的了。
posted on 2008-03-27 15:03 Rabbit 阅读(36148) 评论(15) 编辑 收藏
在fragment出入栈时候添加动画,主要用到FragmentTransaction类中的方法:
public abstract FragmentTransaction setCustomAnimations (int enter, int exit)
Set specific animation resources to run for the fragments that are entering and exiting in this transaction. These animations will not be played when popping the back stack.
public abstract FragmentTransaction setCustomAnimations (int enter, int exit, int popEnter, int popExit)
Set specific animation resources to run for the fragments that are entering and exiting in this transaction. The popEnter and popExit animations will be played for enter/exit operations specifically when popping the back stack.
相关的方法还有(可直接设置标准的动画):
Select a standard transition animation for this transaction. May be one of TRANSIT_NONE, TRANSIT_FRAGMENT_OPEN, or TRANSIT_FRAGMENT_CLOSE
Set a custom style resource that will be used for resolving transit animations.
下面看一个示例:
1.主activity布局文件:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:padding="4dip" android:gravity="center_horizontal" android:layout_width="match_parent" android:layout_height="match_parent"> <FrameLayout android:id="@+id/simple_fragment" android:layout_width="match_parent" android:layout_height="0px" android:layout_weight="1"> </FrameLayout> <Button android:id="@+id/new_fragment" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="0" android:text="@string/new_fragment"> <requestFocus /> </Button> </LinearLayout>
2.主activity,包括一个fragment类:CountingFragment
public class FragmentCustomAnimations extends Activity { int mStackLevel = 1; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.fragment_stack); // Watch for button clicks. Button button = (Button)findViewById(R.id.new_fragment); button.setOnClickListener(new OnClickListener() { public void onClick(View v) { addFragmentToStack(); } }); if (savedInstanceState == null) { // Do first time initialization -- add initial fragment. Fragment newFragment = CountingFragment.newInstance(mStackLevel); FragmentTransaction ft = getFragmentManager().beginTransaction(); ft.add(R.id.simple_fragment, newFragment).commit(); } else { mStackLevel = savedInstanceState.getInt("level"); } } @Override public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putInt("level", mStackLevel); } void addFragmentToStack() { mStackLevel++; // Instantiate a new fragment. Fragment newFragment = CountingFragment.newInstance(mStackLevel); // Add the fragment to the activity, pushing this transaction // on to the back stack. FragmentTransaction ft = getFragmentManager().beginTransaction(); ft.setCustomAnimations(R.animator.fragment_slide_left_enter, R.animator.fragment_slide_left_exit, R.animator.fragment_slide_right_enter, R.animator.fragment_slide_right_exit); ft.replace(R.id.simple_fragment, newFragment); ft.addToBackStack(null); ft.commit(); } public static class CountingFragment extends Fragment { int mNum; /** * Create a new instance of CountingFragment, providing "num" * as an argument. */ static CountingFragment newInstance(int num) { CountingFragment f = new CountingFragment(); // Supply num input as an argument. Bundle args = new Bundle(); args.putInt("num", num); f.setArguments(args); return f; } /** * When creating, retrieve this instance's number from its arguments. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mNum = getArguments() != null ? getArguments().getInt("num") : 1; } /** * The Fragment's UI is just a simple text view showing its * instance number. */ @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View v = inflater.inflate(R.layout.hello_world, container, false); View tv = v.findViewById(R.id.text); ((TextView)tv).setText("Fragment #" + mNum); return v; } } }
2.用户fragment出入站时候的动画文件(在res/animator目录下的四个文件):
fragment_slide_left_enter.xml
<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android"> <objectAnimator android:interpolator="@android:interpolator/decelerate_quint" android:valueFrom="100dp" android:valueTo="0dp" android:valueType="floatType" android:propertyName="translationX" android:duration="@android:integer/config_mediumAnimTime" /> <objectAnimator android:interpolator="@android:interpolator/decelerate_quint" android:valueFrom="0.0" android:valueTo="1.0" android:valueType="floatType" android:propertyName="alpha" android:duration="@android:integer/config_mediumAnimTime" /> </set>
fragment_slide_left_exit.xml
<set xmlns:android="http://schemas.android.com/apk/res/android"> <objectAnimator android:interpolator="@android:interpolator/decelerate_quint" android:valueFrom="0dp" android:valueTo="-100dp" android:valueType="floatType" android:propertyName="translationX" android:duration="@android:integer/config_mediumAnimTime" /> <objectAnimator android:interpolator="@android:interpolator/decelerate_quint" android:valueFrom="1.0" android:valueTo="0.0" android:valueType="floatType" android:propertyName="alpha" android:duration="@android:integer/config_mediumAnimTime" /> </set>
fragment_slide_right_enter.xml:
<set xmlns:android="http://schemas.android.com/apk/res/android"> <objectAnimator android:interpolator="@android:interpolator/decelerate_quint" android:valueFrom="-100dp" android:valueTo="0dp" android:valueType="floatType" android:propertyName="translationX" android:duration="@android:integer/config_mediumAnimTime" /> <objectAnimator android:interpolator="@android:interpolator/decelerate_quint" android:valueFrom="0.0" android:valueTo="1.0" android:valueType="floatType" android:propertyName="alpha" android:duration="@android:integer/config_mediumAnimTime" /> </set>
fragment_slide_right_exit.xml
<set xmlns:android="http://schemas.android.com/apk/res/android"> <objectAnimator android:interpolator="@android:interpolator/decelerate_quint" android:valueFrom="0dp" android:valueTo="100dp" android:valueType="floatType" android:propertyName="translationX" android:duration="@android:integer/config_mediumAnimTime" /> <objectAnimator android:interpolator="@android:interpolator/decelerate_quint" android:valueFrom="1.0" android:valueTo="0.0" android:valueType="floatType" android:propertyName="alpha" android:duration="@android:integer/config_mediumAnimTime" /> </set>
3.fragment中的createView()方法用到的布局文件hello_world.xml:
<TextView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/text" android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center_vertical|center_horizontal" android:textAppearance="?android:attr/textAppearanceMedium" android:text="@string/hello_world"/>
问题:objectAnimator是什么?怎么使用?