GitHub控件之BadgeView(数字提醒)

数字提醒大家肯定都见识过。QQ、微信等app中如果有消息或者提醒的时候,就会展现给用户一个红点或者带有数字的点。前段时间微信上流行把自己的头像换成带有数字提醒的头像,让那些有强迫症的人真是抓狂。 下面我们就看一下怎么在自己的app中实现这种效果。 开发者当然可以自己用相对布局来实现这样的效果。一个还好,但是多了呢!就会很繁琐。GitHub上有一个开源的第三方控件,叫做BadgeView。使用它可以很方面的实现想要的效果。 先来怎么使用,简单的三行代码就可以实现数字提醒: **[java]** [view plain](http://blog.csdn.net/crazy1235/article/details/42262369#)[copy](http://blog.csdn.net/crazy1235/article/details/42262369#)[![在CODE上查看代码片](https://code.csdn.net/assets/CODE_ico.png)](https://code.csdn.net/snippets/571341)[![派生到我的代码片](https://code.csdn.net/assets/ico_fork.svg)](https://code.csdn.net/snippets/571341/fork) <div> <embed id="ZeroClipboardMovie_1" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" type="application/x-shockwave-flash" width="18" height="18" align="middle" name="ZeroClipboardMovie_1"> </embed> </div> </div> - BadgeView badgeView = <span class="keyword">new</span> com.jauker.widget.BadgeView(<span class="keyword">this</span>); - badgeView.setTargetView(textView); - badgeView.setBadgeCount(<span class="number">3</span>); 看一下badgeview中常用的方法: **[java]** [view plain](http://blog.csdn.net/crazy1235/article/details/42262369#)[copy](http://blog.csdn.net/crazy1235/article/details/42262369#)[![在CODE上查看代码片](https://code.csdn.net/assets/CODE_ico.png)](https://code.csdn.net/snippets/571341)[![派生到我的代码片](https://code.csdn.net/assets/ico_fork.svg)](https://code.csdn.net/snippets/571341/fork) <div> <embed id="ZeroClipboardMovie_2" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" type="application/x-shockwave-flash" width="18" height="18" align="middle" name="ZeroClipboardMovie_2"> </embed> </div> </div> - badgeView = <span class="keyword">new</span> BadgeView(<span class="keyword">this</span>); - badgeView.setTargetView(layout); - badgeView.setBackground(<span class="number">12</span>, Color.parseColor(<span class="string">&#8220;#9b2eef&#8221;</span>)); - badgeView.setText(<span class="string">&#8220;提示&#8221;</span>); ...

2015年5月21日 · 1 分钟 · 天边的星星

Android消息推送完美解决方案全析

推送功能在手机应用开发中越来越重要,已经成为手机开发的必须。在Android应用开发中,由于众所周知的原因,Android消息推送我们不得不大费周折。本文就是用来和大家共同探讨一种Android消息推送的完美解决方案。 一、消息推送基础 消息推送,就是在互联网上通过定期传送用户需要的信息来减少信息过载的一项新技术。推送技术通过自动传送信息给用户,来减少用于网络上搜索的时间。它根据用户的兴趣来搜索、过滤信息,并将其定期推给用户,帮助用户高效率地发掘有价值的信息 当我们开发需要和服务器交互的移动应用时,基本上都需要和服务器进行交互,包括上传数据到服务器,同时从服务器上获取数据。 一般情况下,客户端与服务器之间通讯客户端是主动的,但这就存在一个问题就是一旦服务器数据有更新或者服务器要下发通知给客户端只能等客户端连接的时候才能实现。这种方式使消息失去了实时性。 如何使客户端能够实时的收到服务器的消息和通知,总体来说有两种方式,第一种是客户端使用Pull(拉)的方式,就是隔一段时间就去服务器上获取一下信息,看是否有更新的信息出现。第二种就是 服务器使用Push(推送)的方式,当服务器端有新信息了,则把最新的信息Push到客户端上。这样,客户端就能自动的接收到消息。 虽然Pull和Push两种方式都能实现获取服务器端更新信息的功能,但是明显来说Push方式比Pull方式更优越。因为Pull方式更费客户端的网络流量,更主要的是费电量,还需要我们的程序不停地去监测服务端的变化。 二、几种常见的解决方案实现原理 1)轮询(Pull)方式:客户端定时向服务器发送询问消息,一旦服务器有变化则立即同步消息。 2)SMS(Push)方式:通过拦截SMS消息并且解析消息内容来了解服务器的命令,但这种方式一般用户在经济上很难承受。 3)持久连接(Push)方式:客户端和服务器之间建立长久连接,这样就可以实现消息的及时行和实时性。 三、消息推送解决方案概述 A、C2DM云端推送方案 在Android手机平台上,Google提供了C2DM(Cloudto Device Messaging)服务。Android Cloud to Device Messaging (C2DM)是一个用来帮助开发者从服务器向Android应用程序发送数据的服务。该服务提供了一个简单的、轻量级的机制,允许服务器可以通知移动应用程序直接与服务器进行通信,以便于从服务器获取应用程序更新和用户数据。 该方案存在的主要问题是C2DM需要依赖于Google官方提供的C2DM服务器,由于国内的网络环境,这个服务经常不可用。 B、MQTT协议实现Android推送 采用MQTT协议实现Android推送功能也是一种解决方案。MQTT是一个轻量级的消息发布/订阅协议,它是实现基于手机客户端的消息推送服务器的理想解决方案。 wmqtt.jar 是IBM提供的MQTT协议的实现。我们可以从这里(https://github.com/tokudu/AndroidPushNotificationsDemo)下载该项目的实例代码,并且可以找到一个采用PHP书写的服务器端实现(https://github.com/tokudu/PhpMQTTClient)。 C、RSMB实现推送功能 Really Small Message Broker (RSMB) ,是一个简单的MQTT代理,同样由IBM提供,其查看地址是:http://www.alphaworks.ibm.com/tech/rsmb。缺省打开1883端口,应用程序当中,它负责接收来自服务器的消息并将其转发给指定的移动设备。SAM是一个针对MQTT写的PHP库。我们可以从这个http://pecl.php.net/package/sam/download/0.2.0地址下载它. D、XMPP协议实现Android推送 Google官方的C2DM服务器底层也是采用XMPP协议进行的封装。XMPP(可扩展通讯和表示协议)是基于可扩展标记语言(XML)的协议,它用于即时消息(IM)以及在线探测。这个协议可能最终允许因特网用户向因特网上的其他任何人发送即时消息。 androidpn是一个基于XMPP协议的java开源Android push notification实现。它包含了完整的客户端和服务器端。但也存在一些不足之处: 1) 比如时间过长时,就再也收不到推送的信息了。 2)性能上也不够稳定。 3)如果将消息从服务器上推送出去,就不再管理了,不管消息是否成功到达客户端手机上。 如果我们要使用androidpn,则还需要做大量的工作,需要理解XMPP协议、理解Androidpn的实现机制,需要调试内部存在的BUG。 E、使用第三方平台 目前国内、国外有一些推送平台可供使用,但是涉及到收费问题、保密问题、服务质量问题、扩展问题等等,又不得不是我们望而却步。 四、消息推送完美方案 综合以上论述,在建立Android消息推送方面可谓方案多多,但每一款方案都有其优缺点。但无论如何,还是自己搭建一个推送平台是上策。因为你有、他有不如自己有。 举个例子,在搭建自有推送平台上建议使用《某某Android消息推送组件》。该组不仅可以拿来即用,并且还可以提供源码以便扩展,实现自己的特殊需求。 A、推送原理 Android消息推送组件基于XMPP协议实现Android推送。XMPP(可扩展通讯和表示协议)是基于可扩展标记语言(XML)的协议,它用于即时消息(IM)以及在线探测。这个协议可能最终允许因特网用户向因特网上的其他任何人发送即时消息。 Android消息推送组件实现原理见下图: 图1-消息推送原理图 Android消息推送组件由服务器部分和客户端部分组成。每一部分都由XMPP协议组件和外部接口组件构成。XMPP协议组件负责服务器和Android客户端间的连接管理、消息通讯,外部接口组件负责接收应用系统、客户端应用的命令,向应用系统发送接收到的通知消息。 Android消息组件提供基于Tomcat的服务器应用和Android开发jar包。其中基于Tomcat的服务器应用直接在Tomcat上部署即可,Android开发jar包引入Android项目即可。 B 集成方式 1)服务器部署 Android消息组件Tomcat的服务器应用直接部署在Tomcat中,端口号任意设定。 2)客户端jar包引用 在Android项目中建立libs目录,然后将提供的Android开发jar包复制到该目录即可。见下图: 图2-jar包引入图 3)Android项目AndroidManifest.xml文件修改 在该文件中增加以下权限: <uses-permission android:name=“android.permission.READ_PHONE_STATE” /> <uses-permission android:name=“android.permission.ACCESS_NETWORK_STATE” /> ...

2015年5月21日 · 1 分钟 · 天边的星星

Android RecyclerView 使用完全解析 体验艺术般的控件

概述 RecyclerView出现已经有一段时间了,相信大家肯定不陌生了,大家可以通过导入support-v7对其进行使用。 据官方的介绍,该控件用于在有限的窗口中展示大量数据集,其实这样功能的控件我们并不陌生,例如:ListView、GridView。 那么有了ListView、GridView为什么还需要RecyclerView这样的控件呢?整体上看RecyclerView架构,提供了一种插拔式的体验,高度的解耦,异常的灵活,通过设置它提供的不同LayoutManager,ItemDecoration , ItemAnimator实现令人瞠目的效果。 你想要控制其显示的方式,请通过布局管理器LayoutManager 你想要控制Item间的间隔(可绘制),请通过ItemDecoration 你想要控制Item增删的动画,请通过ItemAnimator 你想要控制点击、长按事件,请自己写(擦,这点尼玛。) 基本使用 鉴于我们对于ListView的使用特别的熟悉,对比下RecyclerView的使用代码: `mRecyclerView = findView(R.id.id_recyclerview); &lt;span class="hljs-comment">//设置布局管理器&lt;/span> mRecyclerView.setLayoutManager(layout); &lt;span class="hljs-comment">//设置adapter&lt;/span> mRecyclerView.setAdapter(adapter) &lt;span class="hljs-comment">//设置Item增加、移除动画&lt;/span> mRecyclerView.setItemAnimator(&lt;span class="hljs-keyword">new&lt;/span> DefaultItemAnimator()); &lt;span class="hljs-comment">//添加分割线&lt;/span> mRecyclerView.addItemDecoration(&lt;span class="hljs-keyword">new&lt;/span> DividerItemDecoration( getActivity(), DividerItemDecoration.HORIZONTAL_LIST));` ok,相比较于ListView的代码,ListView可能只需要去设置一个adapter就能正常使用了。而RecyclerView基本需要上面一系列的步骤,那么为什么会添加这么多的步骤呢? 那么就必须解释下RecyclerView的这个名字了,从它类名上看,RecyclerView代表的意义是,我只管Recycler View,也就是说RecyclerView只管回收与复用View,其他的你可以自己去设置。可以看出其高度的解耦,给予你充分的定制自由(所以你才可以轻松的通过这个控件实现ListView,GirdView,瀑布流等效果)。 Just like ListView Activity `&lt;span class="hljs-keyword">package&lt;/span> com.zhy.sample.demo_recyclerview; &lt;span class="hljs-keyword">import&lt;/span> java.util.ArrayList; &lt;span class="hljs-keyword">import&lt;/span> java.util.List; &lt;span class="hljs-keyword">import&lt;/span> android.os.Bundle; &lt;span class="hljs-keyword">import&lt;/span> android.support.v7.app.ActionBarActivity; &lt;span class="hljs-keyword">import&lt;/span> android.support.v7.widget.LinearLayoutManager; &lt;span class="hljs-keyword">import&lt;/span> android.support.v7.widget.RecyclerView; &lt;span class="hljs-keyword">import&lt;/span> android.support.v7.widget.RecyclerView.ViewHolder; &lt;span class="hljs-keyword">import&lt;/span> android.view.LayoutInflater; &lt;span class="hljs-keyword">import&lt;/span> android.view.View; &lt;span class="hljs-keyword">import&lt;/span> android.view.ViewGroup; &lt;span class="hljs-keyword">import&lt;/span> android.widget.TextView; &lt;span class="hljs-keyword">public&lt;/span> &lt;span class="hljs-class">&lt;span class="hljs-keyword">class&lt;/span> &lt;span class="hljs-title">HomeActivity&lt;/span> &lt;span class="hljs-keyword">extends&lt;/span> &lt;span class="hljs-title">ActionBarActivity&lt;/span> {&lt;/span> &lt;span class="hljs-keyword">private&lt;/span> RecyclerView mRecyclerView; &lt;span class="hljs-keyword">private&lt;/span> List&lt;String&gt; mDatas; &lt;span class="hljs-keyword">private&lt;/span> HomeAdapter mAdapter; &lt;span class="hljs-annotation">@Override&lt;/span> &lt;span class="hljs-keyword">protected&lt;/span> &lt;span class="hljs-keyword">void&lt;/span> &lt;span class="hljs-title">onCreate&lt;/span>(Bundle savedInstanceState) { &lt;span class="hljs-keyword">super&lt;/span>.onCreate(savedInstanceState); setContentView(R.layout.activity_single_recyclerview); initData(); mRecyclerView = (RecyclerView) findViewById(R.id.id_recyclerview); mRecyclerView.setLayoutManager(&lt;span class="hljs-keyword">new&lt;/span> LinearLayoutManager(&lt;span class="hljs-keyword">this&lt;/span>)); mRecyclerView.setAdapter(mAdapter = &lt;span class="hljs-keyword">new&lt;/span> HomeAdapter()); } &lt;span class="hljs-keyword">protected&lt;/span> &lt;span class="hljs-keyword">void&lt;/span> &lt;span class="hljs-title">initData&lt;/span>() { mDatas = &lt;span class="hljs-keyword">new&lt;/span> ArrayList&lt;String&gt;(); &lt;span class="hljs-keyword">for&lt;/span> (&lt;span class="hljs-keyword">int&lt;/span> i = &lt;span class="hljs-string">'A'&lt;/span>; i &lt; &lt;span class="hljs-string">'z'&lt;/span>; i++) { mDatas.add(&lt;span class="hljs-string">""&lt;/span> + (&lt;span class="hljs-keyword">char&lt;/span>) i); } } class HomeAdapter extends RecyclerView.Adapter&lt;HomeAdapter.MyViewHolder&gt; { &lt;span class="hljs-annotation">@Override&lt;/span> &lt;span class="hljs-keyword">public&lt;/span> MyViewHolder &lt;span class="hljs-title">onCreateViewHolder&lt;/span>(ViewGroup parent, &lt;span class="hljs-keyword">int&lt;/span> viewType) { MyViewHolder holder = &lt;span class="hljs-keyword">new&lt;/span> MyViewHolder(LayoutInflater.from( HomeActivity.&lt;span class="hljs-keyword">this&lt;/span>).inflate(R.layout.item_home, parent, &lt;span class="hljs-keyword">false&lt;/span>)); &lt;span class="hljs-keyword">return&lt;/span> holder; } &lt;span class="hljs-annotation">@Override&lt;/span> &lt;span class="hljs-keyword">public&lt;/span> &lt;span class="hljs-keyword">void&lt;/span> &lt;span class="hljs-title">onBindViewHolder&lt;/span>(MyViewHolder holder, &lt;span class="hljs-keyword">int&lt;/span> position) { holder.tv.setText(mDatas.get(position)); } &lt;span class="hljs-annotation">@Override&lt;/span> &lt;span class="hljs-keyword">public&lt;/span> &lt;span class="hljs-keyword">int&lt;/span> &lt;span class="hljs-title">getItemCount&lt;/span>() { &lt;span class="hljs-keyword">return&lt;/span> mDatas.size(); } class MyViewHolder extends ViewHolder { TextView tv; &lt;span class="hljs-keyword">public&lt;/span> &lt;span class="hljs-title">MyViewHolder&lt;/span>(View view) { &lt;span class="hljs-keyword">super&lt;/span>(view); tv = (TextView) view.findViewById(R.id.id_num); } } } }` Activity的布局文件 `&lt;span class="hljs-tag">&lt;&lt;span class="hljs-title">RelativeLayout&lt;/span> &lt;span class="hljs-attribute">xmlns:android&lt;/span>=&lt;span class="hljs-value">"http://schemas.android.com/apk/res/android"&lt;/span> &lt;span class="hljs-attribute">xmlns:tools&lt;/span>=&lt;span class="hljs-value">"http://schemas.android.com/tools"&lt;/span> &lt;span class="hljs-attribute">android:layout_width&lt;/span>=&lt;span class="hljs-value">"match_parent"&lt;/span> &lt;span class="hljs-attribute">android:layout_height&lt;/span>=&lt;span class="hljs-value">"match_parent"&lt;/span> &gt;&lt;/span> &lt;span class="hljs-tag">&lt;&lt;span class="hljs-title">android.support.v7.widget.RecyclerView &lt;/span> &lt;span class="hljs-attribute">android:id&lt;/span>=&lt;span class="hljs-value">"@+id/id_recyclerview"&lt;/span> &lt;span class="hljs-attribute">android:divider&lt;/span>=&lt;span class="hljs-value">"#ffff0000"&lt;/span> &lt;span class="hljs-attribute">android:dividerHeight&lt;/span>=&lt;span class="hljs-value">"10dp"&lt;/span> &lt;span class="hljs-attribute">android:layout_width&lt;/span>=&lt;span class="hljs-value">"match_parent"&lt;/span> &lt;span class="hljs-attribute">android:layout_height&lt;/span>=&lt;span class="hljs-value">"match_parent"&lt;/span> /&gt;&lt;/span> &lt;span class="hljs-tag">&lt;/&lt;span class="hljs-title">RelativeLayout&lt;/span>&gt;&lt;/span>` Item的布局文件 `&lt;span class="hljs-pi">&lt;?xml version="1.0" encoding="utf-8"?&gt;&lt;/span> &lt;span class="hljs-tag">&lt;&lt;span class="hljs-title">FrameLayout&lt;/span> &lt;span class="hljs-attribute">xmlns:android&lt;/span>=&lt;span class="hljs-value">"http://schemas.android.com/apk/res/android"&lt;/span> &lt;span class="hljs-attribute">android:layout_width&lt;/span>=&lt;span class="hljs-value">"match_parent"&lt;/span> &lt;span class="hljs-attribute">android:background&lt;/span>=&lt;span class="hljs-value">"#44ff0000"&lt;/span> &lt;span class="hljs-attribute">android:layout_height&lt;/span>=&lt;span class="hljs-value">"wrap_content"&lt;/span> &gt;&lt;/span> &lt;span class="hljs-tag">&lt;&lt;span class="hljs-title">TextView &lt;/span> &lt;span class="hljs-attribute">android:id&lt;/span>=&lt;span class="hljs-value">"@+id/id_num"&lt;/span> &lt;span class="hljs-attribute">android:layout_width&lt;/span>=&lt;span class="hljs-value">"match_parent"&lt;/span> &lt;span class="hljs-attribute">android:layout_height&lt;/span>=&lt;span class="hljs-value">"50dp"&lt;/span> &lt;span class="hljs-attribute">android:gravity&lt;/span>=&lt;span class="hljs-value">"center"&lt;/span> &lt;span class="hljs-attribute">android:text&lt;/span>=&lt;span class="hljs-value">"1"&lt;/span> /&gt;&lt;/span> &lt;span class="hljs-tag">&lt;/&lt;span class="hljs-title">FrameLayout&lt;/span>&gt;&lt;/span>` 这么看起来用法与ListView的代码基本一致哈~~ 看下效果图: ...

2015年5月19日 · 10 分钟 · 天边的星星

设置Viewpager的viewPager.setCurrentItem有一个动画滑动效果

设置Viewpager的viewPager.setCurrentItem(currentIndex+1);有一个动画滑动效果 ViewPagerScroller scroller = new ViewPagerScroller(this); scroller.initViewPagerScroll(viewPager); /** ViewPager 滚动速度设置 */ public class ViewPagerScroller extends Scroller { private int mScrollDuration = 2000; // 滑动速度 /** 设置速度速度 @param duration */ public void setScrollDuration(int duration) { this.mScrollDuration = duration; } public ViewPagerScroller(Context context) { super(context); } public ViewPagerScroller(Context context, Interpolator interpolator) { super(context, interpolator); } @SuppressLint(“NewApi”) public ViewPagerScroller(Context context, Interpolator interpolator, boolean flywheel) { super(context, interpolator, flywheel); } @Override public void startScroll(int startX, int startY, int dx, int dy, int duration) { super.startScroll(startX, startY, dx, dy, mScrollDuration); } ...

2015年5月8日 · 1 分钟 · 天边的星星

Android — RecyclerView

“A flexible view for providing a limited window into a large data set.” 可以说是ListView的升级版,ListVie中我们需要自己写ViewHolder,当然你也可以不写,是在RecylerView中,是要让写的哟~RecyclerView适用于无法在一个屏幕范围内展现格式一样的数据时,需要用多行或多列来展示。例如展示联系人,图片,视频等。用户需要滑动屏幕来查看数据,这时RecyclerView的特性就有用武之地了。比如,当用户滑动使当前一个可视的Item滑出屏幕,这个Item的视图将会被回收并在一个新Item进入可视范围后重新被使用。可回收利用View是个很实用的功能,它不仅可以减少CPU不断inflate View的开销,而且可以节省缓存View的内存开销。 RecylerView还有一大特色,就是动画! RecyclerView不再负责显示工作 和ListView不一样的是,RecyclerView不再负责Item的摆放等显示方面的功能。所有和布局、绘制等方面的工作都其拆分成不同的类进行管理。所以开发者可以自定义各种各样满足定制需求的的功能类。 RecyclerView.Adapter <td valign="top" width="454"> 托管数据集合,为每个Item创建视图 </td> </tr> <tr> <td valign="top" width="326"> RecyclerView.ViewHolder </td> <td valign="top" width="454"> 承载Item视图的子视图 </td> </tr> <tr> <td valign="top" width="326"> RecyclerView.LayoutManager </td> <td valign="top" width="454"> 负责Item视图的布局 </td> </tr> <tr> <td valign="top" width="326"> RecyclerView.ItemDecoration </td> <td valign="top" width="454"> 为每个Item视图添加子视图,在Demo中被用来绘制Divider </td> </tr> <tr> <td valign="top" width="326"> RecyclerView.ItemAnimator </td> <td valign="top" width="454"> 负责添加、删除数据时的动画效果 </td> </tr> ViewHolder 关于ViewHolder,Google早就推荐开发者使用,但也只是建议。但是现在,RecyclerView.Adapter最终要求开发者必须使用ViewHolder。 ...

2015年5月8日 · 3 分钟 · 天边的星星

【Android 应用开发】 自定义组件 宽高适配方法, 手势监听器操作组件, 回调接口维护策略, 绘制方法…

[http://blog.csdn.net/shulianghan/article/details/41520569](http://blog.csdn.net/shulianghan/article/details/41520569?utm_source=tuicool) **博客地址 **: [http://blog.csdn.net/shulianghan/article/details/41520569](http://blog.csdn.net/shulianghan/article/details/41520569) 代码下载 : &#8212; **GitHub **: [https://github.com/han1202012/WheelViewDemo.git](https://github.com/han1202012/WheelViewDemo.git) &#8212; **CSDN **: [http://download.csdn.net/detail/han1202012/8208997](http://download.csdn.net/detail/han1202012/8208997) ; #### 博客总结 : 博文内容 : 本文完整地分析了 WheelView 所有的源码, 包括其 适配器类型 , 两种回调接口 ( 选中条目改变回调 , 和 开始结束滚动回调 ), 以及详细的分析了 WheelView 主题源码, 其中 组件宽高测量 , 手势监听器添加 , 以及 精准的绘图方法 是主要目的, 花了将近1周时间, 感觉很值, 在这里分享给大家; 自定义组件宽高获取策略 : MeasureSpec 最大模式 取 默认值 和 给定值中较小的那个 , 未定义模式取默认值 , 精准模式取 给定值 ; 自定义组件维护各种回调监听器策略 : 维护集合, 将监听器置于集合中, 回调接口时遍历集合元素, 回调每个元素的接口方法; 自定义组件手势监听器添加方法 : 创建手势监听器, 将手势监听器传入手势探测器, 在 onTouchEvent() 方法中回调手势监听器的 onTouchEvent()方法; ## 一. WheelView 简介 ## 1. WheelView 效果 在 Android 中实现类似与 IOS 的 WheelView 控件 : 如图 ![](http://img2.tuicool.com/bMfU7b.png) ## 2. WheelView 使用流程 ### (1) 基本流程简介 a. 创建 WheelView 组件 : 使用 构造方法 或者 从布局文件获取 WheelView 组件; b. 设置显示条目数 : 调用 WheelView 组件对象的 setVisibleItems 方法 设置; c. 设置是否循环 : 设置 WheelView 是否循环, 调用 setCyclic() 方法设置; d. 设置适配器 : 调用 WheelView 组件的 setAdapter() 方法设置; e. 设置条目改变监听器 : 调用 WheelView 组件对象的 addChangingListener() 方法设置; f. 设置滚动监听器 : 调用 WheelView 组件对象的 addScrollingListener() 方法设置; ### (2) 代码实例 a. 创建 WheelView 对象 : ``` //创建 WheelView 组件 final WheelView wheelLeft = new WheelView(context); ...

2015年5月7日 · 47 分钟 · 天边的星星

Android设置虚线、圆角、渐变

有图又真相,先上图再说。 点击效果: 设置虚线: **[html]** [view plain](http://blog.csdn.net/lan410812571/article/details/9946991#)[copy](http://blog.csdn.net/lan410812571/article/details/9946991#)[![在CODE上查看代码片](https://code.csdn.net/assets/CODE_ico.png)](https://code.csdn.net/snippets/83373)[![派生到我的代码片](https://code.csdn.net/assets/ico_fork.svg)](https://code.csdn.net/snippets/83373/fork) <div> <embed id="ZeroClipboardMovie_1" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" type="application/x-shockwave-flash" width="18" height="18" align="middle" name="ZeroClipboardMovie_1"> </embed> </div> </div> - <span class="tag"><?</span><span class="tag-name">xml</span> <span class="attribute">version</span>=<span class="attribute-value">&#8220;1.0&#8221;</span> <span class="attribute">encoding</span>=<span class="attribute-value">&#8220;utf-8&#8221;</span><span class="tag">?></span> - <span class="tag"><</span><span class="tag-name">shape</span> <span class="attribute">xmlns:android</span>=<span class="attribute-value">&#8220;http://schemas.android.com/apk/res/android&#8221;</span> - <span class="attribute">android:shape</span>=<span class="attribute-value">&#8220;line&#8221;</span> <span class="tag">></span> - <span class="tag"><</span><span class="tag-name">stroke</span> - <span class="attribute">android:dashGap</span>=<span class="attribute-value">&#8220;3dp&#8221;</span> - <span class="attribute">android:dashWidth</span>=<span class="attribute-value">&#8220;6dp&#8221;</span> - <span class="attribute">android:width</span>=<span class="attribute-value">&#8220;1dp&#8221;</span> - <span class="attribute">android:color</span>=<span class="attribute-value">&#8220;#63a219&#8221;</span> <span class="tag">/></span> - <span class="tag"><</span><span class="tag-name">size</span> <span class="attribute">android:height</span>=<span class="attribute-value">&#8220;1dp&#8221;</span> <span class="tag">/></span> - <span class="tag"></</span><span class="tag-name">shape</span><span class="tag">></span> 其中,破折线的宽度为dashWith,破折线之间的空隙的宽度为dashGap,当dashGap=0dp时,为实线 ...

2015年5月2日 · 3 分钟 · 天边的星星

Android Studio 修改module名

Android Studio 新建工程自动生成的 module 名为 app,尝试用 refactor->rename 进行改变,发现会报错:failed to complete gradle execution already disposed:Module:app,百度居然又没有答案,google一下就有了,三个步骤: 1.refactor -> rename,先按常规修改这个; 2.修改 settings.gradle 中的模块名; 3.打开文件夹,修改文件夹名。 以上就完成了模块名的修改,最后不要忘了gradle同步一下

2015年4月29日 · 1 分钟 · 天边的星星

使用Android Studio阅读整个Android源码

之前一直在windows下用source insight阅读android源码,效果非常好。 后来远程异地服务器,网络限制,一直用ssh + vim,现在主要还是以这种方式。 最近发现一个不错的东西(早就有了),在android源码中有这么一个目录development/tools/idegen。 顾名思义,是生成ide的project文件,主要是生成intellij的project文件,当然也可用于android studio。 使用之后,发现效果超棒,所以这里专门撰文推荐。 1、效果图 2、编译idegen模块 源码要编过,不然idegen没法生成。 提示: 1 <div class="line number2 index1 alt1"> 2 </div> <div class="line number3 index2 alt2"> 3 </div> <div class="line number4 index3 alt1"> 4 </div> <div class="line number5 index4 alt2"> 5 </div> </td> <td class="code"> <div class="container"> <div class="line number1 index0 alt2"> `// 找不到idegen,需要全局编译一下` </div> <div class="line number2 index1 alt1"> `/*` </div> <div class="line number3 index2 alt2"> `ubuntu:~/Data/cyanogenmod$ . development/tools/idegen/idegen.sh` </div> <div class="line number4 index3 alt1"> `Couldn't find idegen.jar. Please run make first.` </div> <div class="line number5 index4 alt2"> `*/` </div> </div> </td> </tr> </table> </div> 但是我相信很多看源码的人是不需要编译的,所以只要我上传一个idegen.jar: http://jayfeng-files.stor.sinaapp.com/idegen.jar 把这个文件copy到out/host/linux-x86/framework/目录下: ...

2015年4月29日 · 2 分钟 · 天边的星星

android staticlayout使用讲解

使用Canvas的drawText绘制文本是不会自动换行的,即使一个很长很长的字符串,drawText也只显示一行,超出部分被隐藏在屏幕之外。可以逐个计算每个字符的宽度,通过一定的算法将字符串分割成多个部分,然后分别调用drawText一部分一部分的显示, 但是这种显示效率会很低。 StaticLayout是android中处理文字换行的一个工具类,StaticLayout已经实现了文本绘制换行处理,下面是如何使用StaticLayout的例子: package com.example.amdroidstaticlayoutdemo; import android.support.v4.app.Fragment; import android.text.Layout.Alignment; import android.text.StaticLayout; import android.text.TextPaint; import android.app.Activity; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.Paint.Style; import android.os.Bundle; import android.util.AttributeSet; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; import android.os.Build; public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(new MyView(this)); } public class MyView extends View { Paint mPaint; //画笔,包含了画几何图形、文本等的样式和颜色信息 public MyView(Context context) { super(context); } ...

2015年4月29日 · 2 分钟 · 天边的星星