Android开发之多级下拉列表菜单实现(仿美团,淘宝等)

我们在常用的电商或者旅游APP中,例如美团,手机淘宝等等,都能够看的到有那种下拉式的二级列表菜单。具体如图所示: 上面两张图就是美团的一个二级列表菜单的一个展示。我相信很多人都想开发一个跟它一样的功能放到自己的APP中。好,接下来我们就开始动手,解决它。 1,结构分析 首先,我们给出这个下来菜单需要的组建。我们用线框图来分析。 1)如上图所示,最外围的是一个Activity,顶部包含了一个View的容器,这个容器主要是装载ToggleButton来实现诸如美团里面的“美食,全城,理我最近,刷选”这一行。这一行一点就会弹出对应的下来菜单。 2)下拉菜单是如何实现的呢?,这里我们利用了PopupWindow来实现这一弹出式窗口。然后我们在弹出式窗口里面再定义我们的下来列表项,是单列还是二级菜单,都是由里面来定。 3)不同的菜单,需要一级或者需要二级,在这里根据我的需求而变动。我们在PopupWindow上面加一个自定义的LeftView,或者是MiddleView,RightView。主要是一个ToggleButton,你弹出一个窗口,你就定制一个窗口。 3)视图里面嵌入ListView,就形成了列表项。 好分析就到上面为止,接下来我们一步步的说明实现。 2,项目结构 本项目的项目结构如图所示: 1) Adapter。适配器,主要是为ListView提供数据适配的。 2)MainActivity。主活动页面。 3)ExpandTabView。本项目的核心类,它包含ToggleButton容器和PopupWindow,是控制弹出窗口的核心类。 4)ViewLeft,ViewMiddle,ViewRight。是弹出里面嵌套的类,实现不同的列表菜单。 3,MainActivity 承载所有元素。看代码比看文字实在。 **[java]** [view plain](http://blog.csdn.net/minimicall/article/details/39484493#)[copy](http://blog.csdn.net/minimicall/article/details/39484493#)[![在CODE上查看代码片](https://code.csdn.net/assets/CODE_ico.png)](https://code.csdn.net/snippets/473461)[![派生到我的代码片](https://code.csdn.net/assets/ico_fork.svg)](https://code.csdn.net/snippets/473461/fork) <div> </div> </div> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: #006699;">package</span> com.example.expandtabview; </span> - <span style="color: black;"> </span> - <span style="color: black;"> </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: #006699;">import</span> java.util.ArrayList; </span> - <span style="color: black;"> </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: #006699;">import</span> android.app.Activity; </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: #006699;">import</span> android.os.Bundle; </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: #006699;">import</span> android.util.Log; </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: #006699;">import</span> android.view.View; </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: #006699;">import</span> android.widget.Toast; </span> - <span style="color: black;"> </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: #006699;">import</span> com.example.view.ExpandTabView; </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: #006699;">import</span> com.example.view.ViewLeft; </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: #006699;">import</span> com.example.view.ViewMiddle; </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: #006699;">import</span> com.example.view.ViewRight; </span> - <span style="color: black;"> </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: #006699;">public</span> <span class="keyword" style="font-weight: bold; color: #006699;">class</span> MainActivity <span class="keyword" style="font-weight: bold; color: #006699;">extends</span> Activity { </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: #006699;">private</span> <span class="keyword" style="font-weight: bold; color: #006699;">static</span> <span class="keyword" style="font-weight: bold; color: #006699;">final</span> String TAG = <span class="string" style="color: blue;">&#8220;MainActivity&#8221;</span>; </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: #006699;">private</span> ExpandTabView expandTabView; </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: #006699;">private</span> ArrayList<View> mViewArray = <span class="keyword" style="font-weight: bold; color: #006699;">new</span> ArrayList<View>(); </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: #006699;">private</span> ViewLeft viewLeft; </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: #006699;">private</span> ViewMiddle viewMiddle; </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: #006699;">private</span> ViewRight viewRight; </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="annotation" style="color: #646464;">@Override</span> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: #006699;">protected</span> <span class="keyword" style="font-weight: bold; color: #006699;">void</span> onCreate(Bundle savedInstanceState) { </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: #006699;">super</span>.onCreate(savedInstanceState); </span> - <span style="color: black;"> setContentView(R.layout.activity_main); </span> - <span style="color: black;"> initView(); </span> - <span style="color: black;"> initVaule(); </span> - <span style="color: black;"> initListener(); </span> - <span style="color: black;"> </span> - <span style="color: black;"> } </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: #006699;">private</span> <span class="keyword" style="font-weight: bold; color: #006699;">void</span> initView() { </span> - <span style="color: black;"> Log.d(TAG,<span class="string" style="color: blue;">&#8220;initView&#8221;</span>); </span> - <span style="color: black;"> expandTabView = (ExpandTabView) findViewById(R.id.expandtab_view); </span> - <span style="color: black;"> viewLeft = <span class="keyword" style="font-weight: bold; color: #006699;">new</span> ViewLeft(<span class="keyword" style="font-weight: bold; color: #006699;">this</span>); </span> - <span style="color: black;"> viewMiddle = <span class="keyword" style="font-weight: bold; color: #006699;">new</span> ViewMiddle(<span class="keyword" style="font-weight: bold; color: #006699;">this</span>); </span> - <span style="color: black;"> viewRight = <span class="keyword" style="font-weight: bold; color: #006699;">new</span> ViewRight(<span class="keyword" style="font-weight: bold; color: #006699;">this</span>); </span> - <span style="color: black;"> </span> - <span style="color: black;"> } </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: #006699;">private</span> <span class="keyword" style="font-weight: bold; color: #006699;">void</span> initVaule() { </span> - <span style="color: black;"> Log.d(TAG,<span class="string" style="color: blue;">&#8220;initValue&#8221;</span>); </span> - <span style="color: black;"> mViewArray.add(viewLeft); </span> - <span style="color: black;"> mViewArray.add(viewMiddle); </span> - <span style="color: black;"> mViewArray.add(viewRight); </span> - <span style="color: black;"> ArrayList<String> mTextArray = <span class="keyword" style="font-weight: bold; color: #006699;">new</span> ArrayList<String>(); </span> - <span style="color: black;"> mTextArray.add(<span class="string" style="color: blue;">&#8220;距离&#8221;</span>); </span> - <span style="color: black;"> mTextArray.add(<span class="string" style="color: blue;">&#8220;区域&#8221;</span>); </span> - <span style="color: black;"> mTextArray.add(<span class="string" style="color: blue;">&#8220;距离&#8221;</span>); </span> - <span style="color: black;"> expandTabView.setValue(mTextArray, mViewArray);<span class="comment" style="color: #008200;">//将三个下拉列表设置进去</span> </span> - <span style="color: black;"> expandTabView.setTitle(viewLeft.getShowText(), <span class="number" style="color: #c00000;"></span>); </span> - <span style="color: black;"> expandTabView.setTitle(viewMiddle.getShowText(), <span class="number" style="color: #c00000;">1</span>); </span> - <span style="color: black;"> expandTabView.setTitle(viewRight.getShowText(), <span class="number" style="color: #c00000;">2</span>); </span> - <span style="color: black;"> </span> - <span style="color: black;"> } </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: #006699;">private</span> <span class="keyword" style="font-weight: bold; color: #006699;">void</span> initListener() { </span> - <span style="color: black;"> Log.d(TAG,<span class="string" style="color: blue;">&#8220;initListener&#8221;</span>); </span> - <span style="color: black;"> viewLeft.setOnSelectListener(<span class="keyword" style="font-weight: bold; color: #006699;">new</span> ViewLeft.OnSelectListener() { </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="annotation" style="color: #646464;">@Override</span> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: #006699;">public</span> <span class="keyword" style="font-weight: bold; color: #006699;">void</span> getValue(String distance, String showText) { </span> - <span style="color: black;"> Log.d(<span class="string" style="color: blue;">&#8220;ViewLeft&#8221;</span>, <span class="string" style="color: blue;">&#8220;OnSelectListener, getValue&#8221;</span>); </span> - <span style="color: black;"> onRefresh(viewLeft, showText); </span> - <span style="color: black;"> } </span> - <span style="color: black;"> }); </span> - <span style="color: black;"> </span> - <span style="color: black;"> viewMiddle.setOnSelectListener(<span class="keyword" style="font-weight: bold; color: #006699;">new</span> ViewMiddle.OnSelectListener() { </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="annotation" style="color: #646464;">@Override</span> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: #006699;">public</span> <span class="keyword" style="font-weight: bold; color: #006699;">void</span> getValue(String showText) { </span> - <span style="color: black;"> Log.d(<span class="string" style="color: blue;">&#8220;ViewMiddle&#8221;</span>,<span class="string" style="color: blue;">&#8220;OnSelectListener, getValue&#8221;</span>); </span> - <span style="color: black;"> onRefresh(viewMiddle,showText); </span> - <span style="color: black;"> </span> - <span style="color: black;"> } </span> - <span style="color: black;"> }); </span> - <span style="color: black;"> </span> - <span style="color: black;"> viewRight.setOnSelectListener(<span class="keyword" style="font-weight: bold; color: #006699;">new</span> ViewRight.OnSelectListener() { </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="annotation" style="color: #646464;">@Override</span> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: #006699;">public</span> <span class="keyword" style="font-weight: bold; color: #006699;">void</span> getValue(String distance, String showText) { </span> - <span style="color: black;"> Log.d(<span class="string" style="color: blue;">&#8220;ViewRight&#8221;</span>,<span class="string" style="color: blue;">&#8220;OnSelectListener, getValue&#8221;</span>); </span> - <span style="color: black;"> onRefresh(viewRight, showText); </span> - <span style="color: black;"> } </span> - <span style="color: black;"> }); </span> - <span style="color: black;"> </span> - <span style="color: black;"> } </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: #006699;">private</span> <span class="keyword" style="font-weight: bold; color: #006699;">void</span> onRefresh(View view, String showText) { </span> - <span style="color: black;"> Log.d(TAG,<span class="string" style="color: blue;">&#8220;onRefresh,view:&#8221;</span>+view+<span class="string" style="color: blue;">&#8220;,showText:&#8221;</span>+showText); </span> - <span style="color: black;"> expandTabView.onPressBack(); </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: #006699;">int</span> position = getPositon(view); </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: #006699;">if</span> (position >= <span class="number" style="color: #c00000;"></span> && !expandTabView.getTitle(position).equals(showText)) { </span> - <span style="color: black;"> expandTabView.setTitle(showText, position); </span> - <span style="color: black;"> } </span> - <span style="color: black;"> Toast.makeText(MainActivity.<span class="keyword" style="font-weight: bold; color: #006699;">this</span>, showText, Toast.LENGTH_SHORT).show(); </span> - <span style="color: black;"> </span> - <span style="color: black;"> } </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: #006699;">private</span> <span class="keyword" style="font-weight: bold; color: #006699;">int</span> getPositon(View tView) { </span> - <span style="color: black;"> Log.d(TAG,<span class="string" style="color: blue;">&#8220;getPosition&#8221;</span>); </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: #006699;">for</span> (<span class="keyword" style="font-weight: bold; color: #006699;">int</span> i = <span class="number" style="color: #c00000;"></span>; i < mViewArray.size(); i++) { </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: #006699;">if</span> (mViewArray.get(i) == tView) { </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: #006699;">return</span> i; </span> - <span style="color: black;"> } </span> - <span style="color: black;"> } </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: #006699;">return</span> &#8211;<span class="number" style="color: #c00000;">1</span>; </span> - <span style="color: black;"> } </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="annotation" style="color: #646464;">@Override</span> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: #006699;">public</span> <span class="keyword" style="font-weight: bold; color: #006699;">void</span> onBackPressed() { </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: #006699;">if</span> (!expandTabView.onPressBack()) { </span> - <span style="color: black;"> finish(); </span> - <span style="color: black;"> } </span> - <span style="color: black;"> </span> - <span style="color: black;"> } </span> - <span style="color: black;"> </span> - <span style="color: black;">} </span> 4 ,ExpandTabView 最主要就是如何处理当我们点击这些ToggleButton的时候要弹出或者收起这些PopupWindow。 ...

2014年9月25日 · 24 分钟 · 天边的星星

Android常用组件

UI相关 图片 Android-Universal-Image-Loader:com.nostra13.universalimageloader:异步加载、缓存、显示图片 ImageLoader:com.novoda.imageloader:异步加载、缓存、显示图片 picasso:com.squareup.picasso:功能强大的图片下载缓存库 PhotoView:uk\co\senab\photoview:支持缩放和各种手势的ImageView ListView JazzyListView:com.twotoasters.jazzylistview:扩展的ListView,当列表项目在屏幕上可见时产生动画效果 StickyListHeaders:com.emilsjolander.components.stickylistheaders:在ListView中置顶 ListViewAnimations:com.haarman.listviewanimations:带动画的ListView drag-sort-listview:???:拖拽排序ListView的元素 android-swipelistview:???:让listview的item可以向右滑动 下拉刷新 Android-PullToRefresh:com.handmark.pulltorefresh:下拉刷新组件 android-pulltorefresh:???:下拉刷新组件 ActionBar-PullToRefresh:???:下拉刷新组件,下拉时会替换掉ActionBar 菜单 SlidingMenu:com.jeremyfeinstein.slidingmenu:滑动菜单 MenuDrawer:???:滑动菜单组件 Action Bar ActionBarSherlock:com.actionbarsherlock:Action Bar组件 android-actionbar:???:Action Bar组件 GlassActionBar:???:玻璃效果的Action Bar ViewPager Android-ViewPagerIndicator:com.viewpagerindicator:分页显示组件 PagerSlidingTabStrip:com.astuetz.viewpager:页面滑动组件 JazzyViewPager:???:可自定义动画的ViewPager 兼容 NineOldAndroids:com.nineoldandroids:移植Honeycomb版本的动画API到旧版本上 HoloEverywhere:???:移植Android 4.1的Holo主题到旧的版本上 GlowPadBackport:GlowPadBackport:移植Android 4.2 GlowPadView到旧版本上 android-switch-backport:???:移植Android 4的Switch widget到旧版本上 AChartEngine:org.achartengine:Android上的绘图库 android-viewflow:com.taptwo.android.widget:视图切换的效果 android-flip:???:翻页动画组件 Android-AppMsg:???:In-layout notifications android-wheel:kankan.wheel:Android滚动控件 Android-ProgressFragment:???:等待数据的时候,支持显示等待符号的Fragment控件 StaggeredGridView:???:瀑布流GridView布局 Cards-UI:???:卡片布局 cardslib:???:卡片布局 Android-DragArea:???:拖拽排序 Android-StaggeredGrid: ???:类pinterest布局 FlipImageView: ???:通过扩展ImageView,实现了ImageView的各种翻转效果 SmoothProgressBar:???:平滑的ProgressBar,各种效果 SuperToasts:???:Toast的超强扩展 AndroidFloatLabel:???:Textview浮动提示 cropper:???:截图和旋转库 WebApp Cordova:org.apache.cordova:Cordova是PhoneGap贡献给Apache后的开源项目,是从PhoneGap中抽出的核心代码 HtmlSpanner:net.nightwhistler.htmlspanner:Android上的网页渲染库,可渲染CSS ChromeView:???:Chrome内核移植的WebView 推送 个推:com.igexin:手机推送服务 JPush:???:极光推送 百度推送:com.baidu.android.pushservice:百度推送服务 MQTT:ibm.mqtt:MQTT协议,似乎和推送有关系 语音识别 ...

2014年9月20日 · 2 分钟 · 天边的星星

Android之常用Tools【介绍及使用】

Android Tools - draw9patch - lint - hierarchyviewer - traceView - monkey 工具存放路径:sdk/tools/ draw9patch 介绍: 所谓&#8221;*.9.png&#8221;这是Android os里所支持的一种特殊的图片格式,用它可以实现部分拉伸;这种图片是经过”9妹“进行特殊处理过的,如果不处理的话,直接用PNG图就会有失真,拉伸不正常的现象出现。 使用: 双击打开看到 ![](http://img.blog.csdn.net/20140917141621430?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY3ltNDkyMjI0MTAz/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center) 然后将需要拉伸的图片直接拖进去进行拉伸,右侧是拉伸效果 ![](http://img.blog.csdn.net/20140917142108860?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY3ltNDkyMjI0MTAz/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 左侧和上方的黑线交叉的部分即可扩展区域 右侧和下方的黑线交叉的部分即内容显示区域(如做button背景图时,button上文字的显示区域) lint 介绍: Lint 是Android ADT 16引入的优化工具,它可以扫描你的代码,帮助发现潜在的问题,例如: 1.文本国际化(有些文本缺少其它语言版本)例如:layout文件中编写不规范的地方,会给出提示。考虑到国际化,如果直接在xml中写汉字会提醒你把文字写到string配置文件中 2.Layout的性能问题 3.无用的多余的资源 例如:项目中有哪些资源文件引入了却没有在代码中使用的话,会给提示。既包括图片资源、layout文件,也有定义的String常量和Color常量等。考虑到屏幕适配,如果有些图片只在高分辨率中放置了,会提醒你应该在中低分辨率的文件夹下也应该放置一份。 4.不一致的数组大小(在配置文件中) 5.重复的图标,图片 6.可用性问题(如没有为EditText指定 InputType) 7. Manifest xml配置错误。 使用: 有两种使用方式: 通过命令运行: lint 检查布局路径 然后返回检测结果 如图: ![](http://img.blog.csdn.net/20140917145229803?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY3ltNDkyMjI0MTAz/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 通过Eclipse直接运行: 选中项目右键-》AndroidTools-》Run Lint ![](http://img.blog.csdn.net/20140917145930984?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY3ltNDkyMjI0MTAz/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 运行之后显示错误: ![](http://img.blog.csdn.net/20140917150320308?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY3ltNDkyMjI0MTAz/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 双击错误,还能跳到指定布局位置,右侧是错误详解。 hierarchyviewer 介绍: <span style="color: #2c2c2c;">HierarchyViewer能够</span>可视化的角度直观地获得<span lang="en-us">UI</span>布局设计结构和各种属性的信息,帮助我们优化布局设计。(也可以查看其他App的布局) 使用: 打开hierarchyviewer显示了一个虚拟器 ![](http://img.blog.csdn.net/20140917155910586?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY3ltNDkyMjI0MTAz/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center) 选中一个进程的界面,点击Load View Hierarchy 这个按钮,以微信个人界面为例: ![](http://img.blog.csdn.net/20140917161701531?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY3ltNDkyMjI0MTAz/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 首先我们可以看到一个主布局,它下面的子布局是以树形的结构展示,看上去结构非常清晰. ![](http://img.blog.csdn.net/20140917162030437?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY3ltNDkyMjI0MTAz/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 接下来,我们在看看,子布局,可以从下图看到大家最喜欢的“摇一摇”功能条目,清晰的层级结构,以及控件的名称,还有效果图的展示,我们完全可以通过它给提供出来的数据,自己也实现这个布局,就算不去模仿他人的布局,我们也可以通过这个工具去分析我们自己的工程,这样可以更好及更快的找到我们需要优化的地方,进行布局优化。 ![](http://img.blog.csdn.net/20140917162645592?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY3ltNDkyMjI0MTAz/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 点击左下角的图标回到之前的操作界面界面,然后我们在选中微信进程,点击Inspet Screenshot 这个按钮.我们会看到 ![](http://img.blog.csdn.net/20140917163339212?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY3ltNDkyMjI0MTAz/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 从这个界面我们可以看到,控件的类名都已经一丝不挂了,这个界面,分为3部分,左边以树形结构显示布局类名,中间放大左边选中的区域以及,显示颜色值和坐标值,下面的工具条还能对选中区域进行所发,以及刷新频率。右边则可以通过鼠标随意移动,中间则实时刷新数据。 细心的朋友可以能会发现,左下角,3个按钮现在可以随意切换了,三个按钮功能分别是,主界面,布局分析界面,截屏分析界面。 traceView 介绍: TraceView是AndroidSDK里面自带的工具,用于对Android的应用程序以及Framework层的代码进行性能分析。 TraceView是图形化的工具,最终它会产生一个图表,用于对性能分析进行说明。 TraceView可以跟踪到具体的Method 使用: 限制条件: - 对于Android 1.5及以下的版本:不支持。 - 对于Android 1.5以上2.1下(含2.1)的版本:受限支持。trace文件只能生成到SD卡,且必须在程序中加入代码。 - 对于Android 2.2上(含2.2)的版本:全支持。可以不用SD卡,不用在程序中加代码,直接自己用DDMS就可以进程Traceview。 <div style="color: #362e2b;"> 我先演示一下,低版本的用代码,生成trace文件,然后打开分析。 </div> <div style="color: #362e2b;"> <div class="dp-highlighter bg_java"> <div class="bar"> <div class="tools" style="color: silver;"> **[java]** [view plain](http://blog.csdn.net/cym492224103/article/details/39343907#)[copy](http://blog.csdn.net/cym492224103/article/details/39343907#)[print](http://blog.csdn.net/cym492224103/article/details/39343907#)[?](http://blog.csdn.net/cym492224103/article/details/39343907#) <div> </div> </div> </div> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: blue;">package</span> com.example.traceviewdemo; </span> - <span style="color: black;"> </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: blue;">import</span> android.app.Activity; </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: blue;">import</span> android.app.ActionBar; </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: blue;">import</span> android.app.Fragment; </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: blue;">import</span> android.os.Bundle; </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: blue;">import</span> android.os.Debug; </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: blue;">import</span> android.view.LayoutInflater; </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: blue;">import</span> android.view.Menu; </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: blue;">import</span> android.view.MenuItem; </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: blue;">import</span> android.view.View; </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: blue;">import</span> android.view.ViewGroup; </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: blue;">import</span> android.os.Build; </span> - <span style="color: black;"> </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: blue;">public</span> <span class="keyword" style="font-weight: bold; color: blue;">class</span> MainActivity <span class="keyword" style="font-weight: bold; color: blue;">extends</span> Activity { </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="annotation" style="color: #646464;">@Override</span> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">protected</span> <span class="keyword" style="font-weight: bold; color: blue;">void</span> onCreate(Bundle savedInstanceState) { </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">super</span>.onCreate(savedInstanceState); </span> - <span style="color: black;"> <span class="comment" style="color: #008200;">// 开始</span> </span> - <span style="color: black;"> Debug.startMethodTracing(<span class="string" style="color: red;">&#8220;mytrace&#8221;</span>); </span> - <span style="color: black;"> setContentView(R.layout.activity_main); </span> - <span style="color: black;"> action(); </span> - <span style="color: black;"> } </span> - <span style="color: black;"> <span class="annotation" style="color: #646464;">@Override</span> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">protected</span> <span class="keyword" style="font-weight: bold; color: blue;">void</span> onDestroy() { </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">super</span>.onDestroy(); </span> - <span style="color: black;"> <span class="comment" style="color: #008200;">// 停止</span> </span> - <span style="color: black;"> Debug.stopMethodTracing(); </span> - <span style="color: black;"> } </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">private</span> <span class="keyword" style="font-weight: bold; color: blue;">void</span> action(){ </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">for</span> (<span class="keyword" style="font-weight: bold; color: blue;">int</span> i = <span class="number" style="color: #c00000;"></span>; i < <span class="number" style="color: #c00000;">100000</span>; i++) { </span> - <span style="color: black;"> System.out.println(<span class="string" style="color: red;">&#8220;模拟耗时&#8221;</span>); </span> - <span style="color: black;"> } </span> - <span style="color: black;"> } </span> - <span style="color: black;"> </span> - <span style="color: black;">} </span> </div> 需要添加权限: </div> <div style="color: #362e2b;"> <div class="dp-highlighter bg_html"> <div class="bar"> <div class="tools" style="color: silver;"> **[html]** [view plain](http://blog.csdn.net/cym492224103/article/details/39343907#)[copy](http://blog.csdn.net/cym492224103/article/details/39343907#)[print](http://blog.csdn.net/cym492224103/article/details/39343907#)[?](http://blog.csdn.net/cym492224103/article/details/39343907#) <div> </div> </div> </div> - <span style="color: black;"><span class="tag" style="font-weight: bold; color: blue;"><</span><span class="tag-name" style="font-weight: bold; color: blue;">uses-permission</span> <span class="attribute" style="color: red;">android:name</span>=<span class="attribute-value" style="color: blue;">&#8220;android.permission.WRITE_EXTERNAL_STORAGE&#8221;</span> <span class="tag" style="font-weight: bold; color: blue;">/></span> </span> </div> 执行完后,会在sd卡生成一个mytrace.trace文件 </div> <div style="color: #362e2b;"> ![](http://img.blog.csdn.net/20140917173106006?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY3ltNDkyMjI0MTAz/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) </div> <div style="color: #362e2b;"> <span style="color: #4b4b4b;">我们把它导出,然后使用命令行执行分析该文件:</span><span style="color: #4b4b4b;">traceView 文件地址</span> </div> <div> ![](http://img.blog.csdn.net/20140917173247017?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY3ltNDkyMjI0MTAz/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) </div> <div> 显示下图: </div> <div> ![](http://img.blog.csdn.net/20140917175000815?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY3ltNDkyMjI0MTAz/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) </div> <div style="color: #4b4b4b;"> 从上图我们可以看到,MainActivity的action()是最耗时的方法,占用了95%的时候。如果在真实项目中,我们首先就是找到消耗性能的方法,然后对其优化, 还有很多属性大家可以看一下 </div> <div style="color: #4b4b4b;"> ![](http://img.blog.csdn.net/20140917175451646?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY3ltNDkyMjI0MTAz/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) </div> <div style="color: #4b4b4b;"> </div> <div style="color: #4b4b4b;"> 我们在看看,高版本不用代码如何使用traceView的做法 </div> <div style="color: #362e2b;"> 使用DDMS </div> <div style="color: #362e2b;"> 打开devices窗口,选择某个进程,点击右上角的start method profiling </div> <blockquote style="color: #362e2b;"> &nbsp; &nbsp; <div> 运行app一段时间后,再点击已变成stop method profiling的该按钮。eclipse会自动弹出debug的标签(可通过菜单File->save as保存数据)。界面同上 面。 </div> &nbsp; &nbsp; &nbsp; <div> 这种方式不需要修改代码,所以对于没有源码的程序同样可以进行排查。同时可以方便的进行全局性能排查 </div> &nbsp; </blockquote> monkey 介绍: Monkey是Android中的一个命令行工具,可以运行在模拟器里或实际设备中。它向系统发送伪随机的用户事件流(如按键输入、触摸屏输入、手势输入等),实现对正在开发的应用程序进行压力测试。Monkey测试是一种为了测试软件的稳定性、健壮性的快速有效的方法。 使用: <blockquote style="color: #362e2b;"> &nbsp; 基本语法如下: &nbsp; <span class="katex math inline">adb shell monkey [options] &nbsp; 如果不指定options,Monkey将以无反馈模式启动,并把事件任意发送到安装在目标环境中的全部包。下面是一个更为典型的命令行示例,它启动指定的应用程序,并向其发送500个伪随机事件: &nbsp;</span> adb shell monkey -p your.package.name -v 500 &nbsp; ## 命令选项参考 <wbr />

2014年9月20日 · 4 分钟 · 天边的星星

ImageView.ScaleType / android:scaleType值的意义区别

android:scaleType是控制图片如何resized/moved来匹对ImageView的size。 ImageView.ScaleType / android:scaleType值的意义区别: CENTER /center 按图片的原来size居中显示,当图片长/宽超过View的长/宽,则截取图片的居中部分显示 CENTER_CROP / centerCrop 按比例扩大图片的size居中显示,使得图片长(宽)等于或大于View的长(宽) CENTER_INSIDE / centerInside 将图片的内容完整居中显示,通过按比例缩小或原来的size使得图片长/宽等于或小于View的长/宽 FIT_CENTER / fitCenter 把图片按比例扩大/缩小到View的宽度,居中显示 FIT_END / fitEnd 把图片按比例扩大/缩小到View的宽度,显示在View的下部分位置 FIT_START / fitStart 把图片按比例扩大/缩小到View的宽度,显示在View的上部分位置 FIT_XY / fitXY 把图片不按比例扩大/缩小到View的大小显示 MATRIX / matrix 用矩阵来绘制,动态缩小放大图片来显示。</td> </tr> </tbody> </table>

2014年9月3日 · 1 分钟 · 天边的星星

AlarmManager类的应用(实现闹钟功能)

1、AlarmManager,顾名思义,就是“提醒”,是Android中常用的一种系统级别的提示服务,可以实现从指定时间开始,以一个固定的间隔时间执行某项操作,所以常常与广播(Broadcast)连用,实现闹钟等提示功能 2、AlarmManager的常用方法有三个: (1)set(int type,long startTime,PendingIntent pi); 该方法用于设置一次性闹钟,第一个参数表示闹钟类型,第二个参数表示闹钟执行时间,第三个参数表示闹钟响应动作。 (2)setRepeating(int type,long startTime,long intervalTime,PendingIntent pi); 该方法用于设置重复闹钟,第一个参数表示闹钟类型,第二个参数表示闹钟首次执行时间,第三个参数表示闹钟两次执行的间隔时间,第三个参数表示闹钟响应动作。 (3)setInexactRepeating(int type,long startTime,long intervalTime,PendingIntent pi); 该方法也用于设置重复闹钟,与第二个方法相似,不过其两个闹钟执行的间隔时间不是固定的而已。 3、三个方法各个参数详悉: (1)int type:闹钟的类型,常用的有5个值:AlarmManager.ELAPSED_REALTIME、AlarmManager.ELAPSED_REALTIME_WAKEUP、AlarmManager.RTC、AlarmManager.RTC_WAKEUP、AlarmManager.POWER_OFF_WAKEUP。 AlarmManager.ELAPSED_REALTIME表示闹钟在手机睡眠状态下不可用,该状态下闹钟使用相对时间(相对于系统启动开始),状态值为3; AlarmManager.ELAPSED_REALTIME_WAKEUP表示闹钟在睡眠状态下会唤醒系统并执行提示功能,该状态下闹钟也使用相对时间,状态值为2; AlarmManager.RTC表示闹钟在睡眠状态下不可用,该状态下闹钟使用绝对时间,即当前系统时间,状态值为1; AlarmManager.RTC_WAKEUP表示闹钟在睡眠状态下会唤醒系统并执行提示功能,该状态下闹钟使用绝对时间,状态值为0; AlarmManager.POWER_OFF_WAKEUP表示闹钟在手机关机状态下也能正常进行提示功能,所以是5个状态中用的最多的状态之一,该状态下闹钟也是用绝对时间,状态值为4;不过本状态好像受SDK版本影响,某些版本并不支持; (2)long startTime:闹钟的第一次执行时间,以毫秒为单位,可以自定义时间,不过一般使用当前时间。需要注意的是,本属性与第一个属性(type)密切相关,如果第一个参数对应的闹钟使用的是相对时间(ELAPSED_REALTIME和ELAPSED_REALTIME_WAKEUP),那么本属性就得使用相对时间(相对于系统启动时间来说),比如当前时间就表示为:SystemClock.elapsedRealtime();如果第一个参数对应的闹钟使用的是绝对时间(RTC、RTC_WAKEUP、POWER_OFF_WAKEUP),那么本属性就得使用绝对时间,比如当前时间就表示为:System.currentTimeMillis()。 (3)long intervalTime:对于后两个方法来说,存在本属性,表示两次闹钟执行的间隔时间,也是以毫秒为单位。 (4)PendingIntent pi:是闹钟的执行动作,比如发送一个广播、给出提示等等。PendingIntent是Intent的封装类。需要注意的是,如果是通过启动服务来实现闹钟提示的话,PendingIntent对象的获取就应该采用Pending.getService(Context c,int i,Intent intent,int j)方法;如果是通过广播来实现闹钟提示的话,PendingIntent对象的获取就应该采用PendingIntent.getBroadcast(Context c,int i,Intent intent,int j)方法;如果是采用Activity的方式来实现闹钟提示的话,PendingIntent对象的获取就应该采用PendingIntent.getActivity(Context c,int i,Intent intent,int j)方法。如果这三种方法错用了的话,虽然不会报错,但是看不到闹钟提示效果。 ...

2014年8月28日 · 2 分钟 · 天边的星星

android 选择图片或拍照时旋转了90度问题

由于前面的博文中忽略了点内容,所以在这里补上,下面内容就是解决拍照或者选择图片显示的时候图片旋转了90度或者其他度数问题,以便照片可以正面显示:具体如下: 首先直接看上面博文下的拍完照或者选完图后处理部分: <div id="" class="dp-highlighter" style="color: #000000;"> <div class="bar"> <div class="tools" style="font-weight: bold;"> Java代码 <a style="color: #108ac6;" title="收藏这段代码">![收藏代码](http://104zz.iteye.com/images/icon_star.png)</a> </div> </div> - <span style="color: black;"><span class="annotation" style="color: #646464;">@Override</span> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: #7f0055;">protected</span> <span class="keyword" style="font-weight: bold; color: #7f0055;">void</span> onActivityResult(<span class="keyword" style="font-weight: bold; color: #7f0055;">int</span> requestCode, <span class="keyword" style="font-weight: bold; color: #7f0055;">int</span> resultCode, Intent data) { </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: #7f0055;">switch</span> (resultCode) { </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: #7f0055;">case</span> <span class="number" style="color: #c00000;">1</span>: </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: #7f0055;">if</span> (data != <span class="keyword" style="font-weight: bold; color: #7f0055;">null</span>) { </span> - <span style="color: black;"> <span class="comment" style="color: #008200;">// 取得返回的Uri,基本上选择照片的时候返回的是以Uri形式,但是在拍照中有得机子呢Uri是空的,所以要特别注意</span> </span> - <span style="color: black;"> Uri mImageCaptureUri = data.getData(); </span> - <span style="color: black;"> <span class="comment" style="color: #008200;">// 返回的Uri不为空时,那么图片信息数据都会在Uri中获得。如果为空,那么我们就进行下面的方式获取</span> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: #7f0055;">if</span> (mImageCaptureUri != <span class="keyword" style="font-weight: bold; color: #7f0055;">null</span>) { </span> - <span style="color: black;"> setImage(mImageCaptureUri);<span class="comment" style="color: #008200;">// 根据Uri处理并显示图片</span> </span> - <span style="color: black;"> } </span> - <span style="color: black;"> } </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: #7f0055;">break</span>; </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: #7f0055;">default</span>: </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: #7f0055;">break</span>; </span> - <span style="color: black;"> </span> - <span style="color: black;"> } </span> - <span style="color: black;"> } </span> </div> 第二:处理90度问题并显示: <div id="" class="dp-highlighter" style="color: #000000;"> <div class="bar"> <div class="tools" style="font-weight: bold;"> Java代码 <a style="color: #108ac6;" title="收藏这段代码">![收藏代码](http://104zz.iteye.com/images/icon_star.png)</a> </div> </div> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: #7f0055;">private</span> <span class="keyword" style="font-weight: bold; color: #7f0055;">void</span> setImage(Uri mImageCaptureUri) { </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="comment" style="color: #008200;">// 不管是拍照还是选择图片每张图片都有在数据中存储也存储有对应旋转角度orientation值</span> </span> - <span style="color: black;"> <span class="comment" style="color: #008200;">// 所以我们在取出图片是把角度值取出以便能正确的显示图片,没有旋转时的效果观看</span> </span> - <span style="color: black;"> </span> - <span style="color: black;"> ContentResolver cr = <span class="keyword" style="font-weight: bold; color: #7f0055;">this</span>.getContentResolver(); </span> - <span style="color: black;"> Cursor cursor = cr.query(mImageCaptureUri, <span class="keyword" style="font-weight: bold; color: #7f0055;">null</span>, <span class="keyword" style="font-weight: bold; color: #7f0055;">null</span>, <span class="keyword" style="font-weight: bold; color: #7f0055;">null</span>, <span class="keyword" style="font-weight: bold; color: #7f0055;">null</span>);<span class="comment" style="color: #008200;">// 根据Uri从数据库中找</span> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: #7f0055;">if</span> (cursor != <span class="keyword" style="font-weight: bold; color: #7f0055;">null</span>) { </span> - <span style="color: black;"> cursor.moveToFirst();<span class="comment" style="color: #008200;">// 把游标移动到首位,因为这里的Uri是包含ID的所以是唯一的不需要循环找指向第一个就是了</span> </span> - <span style="color: black;"> String filePath = cursor.getString(cursor.getColumnIndex(<span class="string" style="color: blue;">&#8220;_data&#8221;</span>));<span class="comment" style="color: #008200;">// 获取图片路</span> </span> - <span style="color: black;"> String orientation = cursor.getString(cursor </span> - <span style="color: black;"> .getColumnIndex(<span class="string" style="color: blue;">&#8220;orientation&#8221;</span>));<span class="comment" style="color: #008200;">// 获取旋转的角度</span> </span> - <span style="color: black;"> cursor.close(); </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: #7f0055;">if</span> (filePath != <span class="keyword" style="font-weight: bold; color: #7f0055;">null</span>) { </span> - <span style="color: black;"> Bitmap bitmap = BitmapFactory.decodeFile(filePath);<span class="comment" style="color: #008200;">//根据Path读取资源图片</span> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: #7f0055;">int</span> angle = <span class="number" style="color: #c00000;"></span>; </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: #7f0055;">if</span> (orientation != <span class="keyword" style="font-weight: bold; color: #7f0055;">null</span> && !<span class="string" style="color: blue;">&#8220;&#8221;</span>.equals(orientation)) { </span> - <span style="color: black;"> angle = Integer.parseInt(orientation); </span> - <span style="color: black;"> } </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: #7f0055;">if</span> (angle != <span class="number" style="color: #c00000;"></span>) { </span> - <span style="color: black;"> <span class="comment" style="color: #008200;">// 下面的方法主要作用是把图片转一个角度,也可以放大缩小等</span> </span> - <span style="color: black;"> Matrix m = <span class="keyword" style="font-weight: bold; color: #7f0055;">new</span> Matrix(); </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: #7f0055;">int</span> width = bitmap.getWidth(); </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: #7f0055;">int</span> height = bitmap.getHeight(); </span> - <span style="color: black;"> m.setRotate(angle); <span class="comment" style="color: #008200;">// 旋转angle度</span> </span> - <span style="color: black;"> bitmap = Bitmap.createBitmap(bitmap, <span class="number" style="color: #c00000;"></span>, <span class="number" style="color: #c00000;"></span>, width, height, </span> - <span style="color: black;"> m, <span class="keyword" style="font-weight: bold; color: #7f0055;">true</span>);<span class="comment" style="color: #008200;">// 从新生成图片</span> </span> - <span style="color: black;"> </span> - <span style="color: black;"> } </span> - <span style="color: black;"> photo.setImageBitmap(bitmap); </span> - <span style="color: black;"> } </span> - <span style="color: black;"> } </span> - <span style="color: black;">} </span> </div> <span style="color: #000000;"> OK完成</span>

2014年8月28日 · 4 分钟 · 天边的星星

Android开发之拍照功能实现(附源码)

大家好,这是一个简单的拍照功能,很简单的界面,一个显示图像区域SurfaceView一个“拍照”按钮。直接上代码! 1、CameraDemoActivity.java(主界面) - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: #0000ff;">package</span> org.winplus.camera; </span> - <span style="color: black;"> </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: #0000ff;">import</span> java.io.File; </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: #0000ff;">import</span> java.io.FileOutputStream; </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: #0000ff;">import</span> java.io.IOException; </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: #0000ff;">import</span> java.util.Date; </span> - <span style="color: black;"> </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: #0000ff;">import</span> android.app.Activity; </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: #0000ff;">import</span> android.content.pm.ActivityInfo; </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: #0000ff;">import</span> android.graphics.PixelFormat; </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: #0000ff;">import</span> android.hardware.Camera; </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: #0000ff;">import</span> android.os.AsyncTask; </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: #0000ff;">import</span> android.os.Bundle; </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: #0000ff;">import</span> android.os.Environment; </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: #0000ff;">import</span> android.text.format.DateFormat; </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: #0000ff;">import</span> android.util.Log; </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: #0000ff;">import</span> android.view.KeyEvent; </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: #0000ff;">import</span> android.view.SurfaceHolder; </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: #0000ff;">import</span> android.view.SurfaceView; </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: #0000ff;">import</span> android.view.View; </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: #0000ff;">import</span> android.view.Window; </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: #0000ff;">import</span> android.view.View.OnClickListener; </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: #0000ff;">import</span> android.widget.Button; </span> - <span style="color: black;"> </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: #0000ff;">public</span> <span class="keyword" style="font-weight: bold; color: #0000ff;">class</span> CameraDemoActivity <span class="keyword" style="font-weight: bold; color: #0000ff;">extends</span> Activity{ </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: #0000ff;">private</span> <span class="keyword" style="font-weight: bold; color: #0000ff;">final</span> <span class="keyword" style="font-weight: bold; color: #0000ff;">static</span> String TAG = <span class="string" style="color: #009900;">&#8220;CameraActivity&#8221;</span>; </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: #0000ff;">private</span> SurfaceView surfaceView; </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: #0000ff;">private</span> SurfaceHolder surfaceHolder; </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: #0000ff;">private</span> Camera camera; </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: #0000ff;">private</span> File picture; </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: #0000ff;">private</span> Button btnSave; </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="annotation" style="color: #646464;">@Override</span> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: #0000ff;">public</span> <span class="keyword" style="font-weight: bold; color: #0000ff;">void</span> onCreate(Bundle savedInstanceState) { </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: #0000ff;">super</span>.onCreate(savedInstanceState); </span> - <span style="color: black;"> setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: #0000ff;">this</span>.requestWindowFeature(Window.FEATURE_NO_TITLE); </span> - <span style="color: black;"> setContentView(R.layout.main); </span> - <span style="color: black;"> setupViews(); </span> - <span style="color: black;"> } </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: #0000ff;">private</span> <span class="keyword" style="font-weight: bold; color: #0000ff;">void</span> setupViews(){ </span> - <span style="color: black;"> surfaceView = (SurfaceView) findViewById(R.id.camera_preview); <span class="comment" style="color: #999999;">// Camera interface to instantiate components</span> </span> - <span style="color: black;"> surfaceHolder = surfaceView.getHolder(); <span class="comment" style="color: #999999;">// Camera interface to instantiate components</span> </span> - <span style="color: black;"> surfaceHolder.addCallback(surfaceCallback); <span class="comment" style="color: #999999;">// Add a callback for the SurfaceHolder</span> </span> - <span style="color: black;"> surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); </span> - <span style="color: black;"> </span> - <span style="color: black;"> btnSave = (Button) findViewById(R.id.save_pic); </span> - <span style="color: black;"> </span> - <span style="color: black;"> btnSave.setOnClickListener(<span class="keyword" style="font-weight: bold; color: #0000ff;">new</span> OnClickListener() { </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="annotation" style="color: #646464;">@Override</span> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: #0000ff;">public</span> <span class="keyword" style="font-weight: bold; color: #0000ff;">void</span> onClick(View v) { </span> - <span style="color: black;"> takePic(); </span> - <span style="color: black;"> } </span> - <span style="color: black;"> }); </span> - <span style="color: black;"> } </span> - <span style="color: black;"> </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="annotation" style="color: #646464;">@Override</span> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: #0000ff;">public</span> <span class="keyword" style="font-weight: bold; color: #0000ff;">boolean</span> onKeyDown(<span class="keyword" style="font-weight: bold; color: #0000ff;">int</span> keyCode, KeyEvent event) { </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: #0000ff;">if</span> (keyCode == KeyEvent.KEYCODE_CAMERA </span> - <span style="color: black;"> || keyCode == KeyEvent.KEYCODE_SEARCH) { </span> - <span style="color: black;"> takePic(); </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: #0000ff;">return</span> <span class="keyword" style="font-weight: bold; color: #0000ff;">true</span>; </span> - <span style="color: black;"> } </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: #0000ff;">return</span> <span class="keyword" style="font-weight: bold; color: #0000ff;">super</span>.onKeyDown(keyCode, event); </span> - <span style="color: black;"> } </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: #0000ff;">private</span> <span class="keyword" style="font-weight: bold; color: #0000ff;">void</span> takePic() { </span> - <span style="color: black;"> </span> - <span style="color: black;"> camera.stopPreview();<span class="comment" style="color: #999999;">// stop the preview</span> </span> - <span style="color: black;"> </span> - <span style="color: black;"> camera.takePicture(<span class="keyword" style="font-weight: bold; color: #0000ff;">null</span>, <span class="keyword" style="font-weight: bold; color: #0000ff;">null</span>, pictureCallback); <span class="comment" style="color: #999999;">// picture</span> </span> - <span style="color: black;"> } </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="comment" style="color: #999999;">// Photo call back</span> </span> - <span style="color: black;"> Camera.PictureCallback pictureCallback = <span class="keyword" style="font-weight: bold; color: #0000ff;">new</span> Camera.PictureCallback() { </span> - <span style="color: black;"> <span class="comment" style="color: #999999;">//@Override</span> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: #0000ff;">public</span> <span class="keyword" style="font-weight: bold; color: #0000ff;">void</span> onPictureTaken(<span class="keyword" style="font-weight: bold; color: #0000ff;">byte</span>[] data, Camera camera) { </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: #0000ff;">new</span> SavePictureTask().execute(data); </span> - <span style="color: black;"> camera.startPreview(); </span> - <span style="color: black;"> } </span> - <span style="color: black;"> }; </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="comment" style="color: #999999;">// save pic</span> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: #0000ff;">class</span> SavePictureTask <span class="keyword" style="font-weight: bold; color: #0000ff;">extends</span> AsyncTask<<span class="keyword" style="font-weight: bold; color: #0000ff;">byte</span>[], String, String> { </span> - <span style="color: black;"> <span class="annotation" style="color: #646464;">@Override</span> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: #0000ff;">protected</span> String doInBackground(<span class="keyword" style="font-weight: bold; color: #0000ff;">byte</span>[]&#8230; params) { </span> - <span style="color: black;"> String fname = DateFormat.format(<span class="string" style="color: #009900;">&#8220;yyyyMMddhhmmss&#8221;</span>, <span class="keyword" style="font-weight: bold; color: #0000ff;">new</span> Date()).toString()+<span class="string" style="color: #009900;">&#8220;.jpg&#8221;</span>; </span> - <span style="color: black;"> </span> - <span style="color: black;"> Log.i(TAG, <span class="string" style="color: #009900;">&#8220;fname=&#8221;</span>+fname+<span class="string" style="color: #009900;">&#8220;;dir=&#8221;</span>+Environment.getExternalStorageDirectory()); </span> - <span style="color: black;"> <span class="comment" style="color: #999999;">//picture = new File(Environment.getExternalStorageDirectory(),fname);// create file</span> </span> - <span style="color: black;"> </span> - <span style="color: black;"> picture = <span class="keyword" style="font-weight: bold; color: #0000ff;">new</span> File(Environment.getExternalStorageDirectory()+<span class="string" style="color: #009900;">&#8220;/&#8221;</span>+fname); </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: #0000ff;">try</span> { </span> - <span style="color: black;"> FileOutputStream fos = <span class="keyword" style="font-weight: bold; color: #0000ff;">new</span> FileOutputStream(picture.getPath()); <span class="comment" style="color: #999999;">// Get file output stream</span> </span> - <span style="color: black;"> fos.write(params[<span class="number" style="color: #c00000;"></span>]); <span class="comment" style="color: #999999;">// Written to the file</span> </span> - <span style="color: black;"> fos.close(); </span> - <span style="color: black;"> } <span class="keyword" style="font-weight: bold; color: #0000ff;">catch</span> (Exception e) { </span> - <span style="color: black;"> e.printStackTrace(); </span> - <span style="color: black;"> } </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: #0000ff;">return</span> <span class="keyword" style="font-weight: bold; color: #0000ff;">null</span>; </span> - <span style="color: black;"> } </span> - <span style="color: black;"> } </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="comment" style="color: #999999;">// SurfaceHodler Callback handle to open the camera, off camera and photo size changes</span> </span> - <span style="color: black;"> SurfaceHolder.Callback surfaceCallback = <span class="keyword" style="font-weight: bold; color: #0000ff;">new</span> SurfaceHolder.Callback() { </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: #0000ff;">public</span> <span class="keyword" style="font-weight: bold; color: #0000ff;">void</span> surfaceCreated(SurfaceHolder holder) { </span> - <span style="color: black;"> Log.i(TAG, <span class="string" style="color: #009900;">&#8220;surfaceCallback====&#8221;</span>); </span> - <span style="color: black;"> camera = Camera.open(); <span class="comment" style="color: #999999;">// Turn on the camera</span> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: #0000ff;">try</span> { </span> - <span style="color: black;"> camera.setPreviewDisplay(holder); <span class="comment" style="color: #999999;">// Set Preview</span> </span> - <span style="color: black;"> } <span class="keyword" style="font-weight: bold; color: #0000ff;">catch</span> (IOException e) { </span> - <span style="color: black;"> camera.release();<span class="comment" style="color: #999999;">// release camera</span> </span> - <span style="color: black;"> camera = <span class="keyword" style="font-weight: bold; color: #0000ff;">null</span>; </span> - <span style="color: black;"> } </span> - <span style="color: black;"> } </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: #0000ff;">public</span> <span class="keyword" style="font-weight: bold; color: #0000ff;">void</span> surfaceChanged(SurfaceHolder holder, <span class="keyword" style="font-weight: bold; color: #0000ff;">int</span> format, <span class="keyword" style="font-weight: bold; color: #0000ff;">int</span> width, </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: #0000ff;">int</span> height) { </span> - <span style="color: black;"> Log.i(TAG,<span class="string" style="color: #009900;">&#8220;====surfaceChanged&#8221;</span>); </span> - <span style="color: black;"> Camera.Parameters parameters = camera.getParameters(); <span class="comment" style="color: #999999;">// Camera parameters to obtain</span> </span> - <span style="color: black;"> parameters.setPictureFormat(PixelFormat.JPEG);<span class="comment" style="color: #999999;">// Setting Picture Format</span> </span> - <span style="color: black;"><span class="comment" style="color: #999999;">// parameters.set(&#8220;rotation&#8221;, 180); // Arbitrary rotation</span> </span> - <span style="color: black;"> camera.setDisplayOrientation(<span class="number" style="color: #c00000;"></span>); </span> - <span style="color: black;"><span class="comment" style="color: #999999;">// parameters.setPreviewSize(400, 300); // Set Photo Size</span> </span> - <span style="color: black;"> camera.setParameters(parameters); <span class="comment" style="color: #999999;">// Setting camera parameters</span> </span> - <span style="color: black;"> camera.startPreview(); <span class="comment" style="color: #999999;">// Start Preview</span> </span> - <span style="color: black;"> } </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: #0000ff;">public</span> <span class="keyword" style="font-weight: bold; color: #0000ff;">void</span> surfaceDestroyed(SurfaceHolder holder) { </span> - <span style="color: black;"> Log.i(TAG,<span class="string" style="color: #009900;">&#8220;====surfaceDestroyed&#8221;</span>); </span> - <span style="color: black;"> camera.stopPreview();<span class="comment" style="color: #999999;">// stop preview</span> </span> - <span style="color: black;"> camera.release(); <span class="comment" style="color: #999999;">// Release camera resources</span> </span> - <span style="color: black;"> camera = <span class="keyword" style="font-weight: bold; color: #0000ff;">null</span>; </span> - <span style="color: black;"> } </span> - <span style="color: black;"> }; </span> - <span style="color: black;">} </span> <span style="color: #362e2b;">2、main.xml(布局文件)</span> - <span style="color: black;"><span class="tag" style="font-weight: bold; color: #993300;"><?</span><span class="tag-name" style="font-weight: bold; color: #993300;">xml</span> <span class="attribute" style="color: red;">version</span>=<span class="attribute-value" style="color: blue;">&#8220;1.0&#8221;</span> <span class="attribute" style="color: red;">encoding</span>=<span class="attribute-value" style="color: blue;">&#8220;utf-8&#8221;</span><span class="tag" style="font-weight: bold; color: #993300;">?></span> </span> - <span style="color: black;"><span class="tag" style="font-weight: bold; color: #993300;"><</span><span class="tag-name" style="font-weight: bold; color: #993300;">LinearLayout</span> <span class="attribute" style="color: red;">xmlns:android</span>=<span class="attribute-value" style="color: blue;">&#8220;http://schemas.android.com/apk/res/android&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:layout_width</span>=<span class="attribute-value" style="color: blue;">&#8220;fill_parent&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:layout_height</span>=<span class="attribute-value" style="color: blue;">&#8220;fill_parent&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:orientation</span>=<span class="attribute-value" style="color: blue;">&#8220;vertical&#8221;</span> <span class="tag" style="font-weight: bold; color: #993300;">></span> </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="tag" style="font-weight: bold; color: #993300;"><</span><span class="tag-name" style="font-weight: bold; color: #993300;">android.view.SurfaceView</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:id</span>=<span class="attribute-value" style="color: blue;">&#8220;@+id/camera_preview&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:layout_width</span>=<span class="attribute-value" style="color: blue;">&#8220;800dip&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:layout_height</span>=<span class="attribute-value" style="color: blue;">&#8220;600dip&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:layout_alignParentTop</span>=<span class="attribute-value" style="color: blue;">&#8220;true&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:layout_centerInParent</span>=<span class="attribute-value" style="color: blue;">&#8220;true&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:layout_gravity</span>=<span class="attribute-value" style="color: blue;">&#8220;center_vertical|center_horizontal&#8221;</span> <span class="tag" style="font-weight: bold; color: #993300;">/></span> </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="tag" style="font-weight: bold; color: #993300;"><</span><span class="tag-name" style="font-weight: bold; color: #993300;">Button</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:id</span>=<span class="attribute-value" style="color: blue;">&#8220;@+id/save_pic&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:layout_width</span>=<span class="attribute-value" style="color: blue;">&#8220;fill_parent&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:layout_height</span>=<span class="attribute-value" style="color: blue;">&#8220;wrap_content&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:text</span>=<span class="attribute-value" style="color: blue;">&#8220;@string/txt_save&#8221;</span> <span class="tag" style="font-weight: bold; color: #993300;">/></span> </span> - <span style="color: black;"> </span> - <span style="color: black;"><span class="tag" style="font-weight: bold; color: #993300;"></</span><span class="tag-name" style="font-weight: bold; color: #993300;">LinearLayout</span><span class="tag" style="font-weight: bold; color: #993300;">></span> </span> <br style="color: #362e2b;" /><span style="color: #362e2b;">3、别忘了添加权限:</span> <div class="dp-highlighter bg_html" style="color: #362e2b;"> - <span style="color: black;"><span class="tag" style="font-weight: bold; color: #993300;"><</span><span class="tag-name" style="font-weight: bold; color: #993300;">uses-permission</span> <span class="attribute" style="color: red;">android:name</span>=<span class="attribute-value" style="color: blue;">&#8220;android.permission.CAMERA&#8221;</span> <span class="tag" style="font-weight: bold; color: #993300;">/></span> </span> - <span style="color: black;"> </span> - <span style="color: black;"><span class="tag" style="font-weight: bold; color: #993300;"><</span><span class="tag-name" style="font-weight: bold; color: #993300;">uses-feature</span> <span class="attribute" style="color: red;">android:name</span>=<span class="attribute-value" style="color: blue;">&#8220;android.hardware.camera&#8221;</span> <span class="tag" style="font-weight: bold; color: #993300;">/></span> </span> - <span style="color: black;"><span class="tag" style="font-weight: bold; color: #993300;"><</span><span class="tag-name" style="font-weight: bold; color: #993300;">uses-feature</span> <span class="attribute" style="color: red;">android:name</span>=<span class="attribute-value" style="color: blue;">&#8220;android.hardware.camera.autofocus&#8221;</span> <span class="attribute" style="color: red;">android:required</span>=<span class="attribute-value" style="color: blue;">&#8220;false&#8221;</span> <span class="tag" style="font-weight: bold; color: #993300;">/></span> </span> </div> <div class="dp-highlighter bg_html" style="color: #362e2b;"> - <span style="color: black;"> </span> </div> [源码下载==》](http://download.csdn.net/detail/tangcheng_ok/3874071) 原创文章,转载请注明出处:http://www.blog.csdn.net/tangcheng_ok

2014年8月24日 · 10 分钟 · 天边的星星

使用startForeground让android服务前台运行

最近在使用android 4.1系统的时候,发现在手机休眠一段时间后(1-2小时),后台运行的服务被强行kill掉,有可能是系统回收内存的一种机制,要想避免这种情况可以通过startForeground让服务前台运行,当stopservice的时候通过stopForeground去掉。以下是android官方描述:Running a Service in the Foreground A foreground service(前台服务) is a service that’s considered to be(被用户所认可的) something the user is actively aware of and thus not a candidate for(而不是一个候选的,可以在内存不足时,被系统杀死的) the system to kill when low on memory. A foreground service must provide a notification for the status bar(前台服务必须提供一个显示通知), which is placed under the “Ongoing” heading(它是不可以忽略的), which means that the notification cannot be dismissed unless the service is either stopped or removed from the foreground.(意思是通知信息不能被忽略,除非服务停止或主动移除,否则将一直显示。) For example, a music player that plays music from a service should be set to run in the foreground, because the user is explicitly aware of its operation(用户明确了解其运作). The notification in the status bar might indicate the current song and allow the user to launch an activity to interact with the music player.To request that your service run in the foreground, call startForeground(). This method takes two parameters: an integer that uniquely identifies the notification and the Notification for the status bar. For example:Notification notification = new Notification(R.drawable.icon, getText(R.string.ticker_text),System.currentTimeMillis());Intent notificationIntent = new Intent(this, ExampleActivity.class);PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0);notification.setLatestEventInfo(this, getText(R.string.notification_title),getText(R.string.notification_message), pendingIntent);startForeground(ONGOING_NOTIFICATION, notification);To remove the service from the foreground, call stopForeground(). This method takes a boolean, indicating whether to remove the status bar notification as well. This method does not stop the service. However, if you stop the service while it’s still running in the foreground, then the notification is also removed. ...

2014年8月20日 · 2 分钟 · 天边的星星

Android开发:优化电池续航-监听电量和充电状态

翻自:http://developer.android.com/training/monitoring-device-state/battery-monitoring.html 当你在更改后台更新频率来减少这些更新对电池寿命的影响时,检查当前电量和充电状态是一个好的开始。 电池寿命通过剩余电量和充电状态来影响应用更新的执行。当用交流电充电时,执行更新操作对设备的影响是微不足道的,所以在大多数案例里,你可以把更新频率调到最快。如果设备不在充电,降低更新频率可以帮助延长电池寿命。 类似的,你可以检查电池剩余电量级别,在电量低时,应该降低更新频率甚至停止更新。 注:此处的更新,指的是类似发送心跳包的动作,或者定时更新内容。并非仅仅指更新应用版本。如果是用户动作,比如翻页刷新,不需要根据电量和充电状态处理。 判断当前充电状态 通过判断当前充电状态开始。BatteryManager会通过一个intent广播所有电池和充电详情,包含充电状态。 因为这是一个sticky intent,你不需要注册广播接收器。简单地通过调用 registerReceiver,像下面的代码段传入一个null的接收器,当前电池状态的intent就会返回。你也可以传入一个真实的接收器对象,但我们暂时不会操作更新,所以这是没必要的。 ``` 1 2 3 4 5 6 7 8 9 10 11 12 13 </td> <td class="code"> ``` IntentFilter ifilter <span style="color: #339933;">=</span> <span style="font-weight: bold;">new</span> IntentFilter<span style="color: #009900;">(</span>Intent.<span style="color: #006633;">ACTION_BATTERY_CHANGED</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span> Intent batteryStatus <span style="color: #339933;">=</span> context.<span style="color: #006633;">registerReceiver</span><span style="color: #009900;">(</span><span style="font-weight: bold; color: #000066;">null</span>, ifilter<span style="color: #009900;">)</span><span style="color: #339933;">;</span> <span style="font-style: italic; color: #666666;">//你可以读到充电状态,如果在充电,可以读到是usb还是交流电</span> <span style="font-style: italic; color: #666666;">// 是否在充电</span> <span style="font-weight: bold; color: #000066;">int</span> status <span style="color: #339933;">=</span> batteryStatus.<span style="color: #006633;">getIntExtra</span><span style="color: #009900;">(</span>BatteryManager.<span style="color: #006633;">EXTRA_STATUS</span>, <span style="color: #339933;">-</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span> <span style="font-weight: bold; color: #000066;">boolean</span> isCharging <span style="color: #339933;">=</span> status <span style="color: #339933;">==</span> BatteryManager.<span style="color: #006633;">BATTERY_STATUS_CHARGING</span> <span style="color: #339933;">||</span> status <span style="color: #339933;">==</span> BatteryManager.<span style="color: #006633;">BATTERY_STATUS_FULL</span><span style="color: #339933;">;</span> <span style="font-style: italic; color: #666666;">// 怎么充</span> <span style="font-weight: bold; color: #000066;">int</span> chargePlug <span style="color: #339933;">=</span> batteryStatus.<span style="color: #006633;">getIntExtra</span><span style="color: #009900;">(</span>BatteryManager.<span style="color: #006633;">EXTRA_PLUGGED</span>, <span style="color: #339933;">-</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span> <span style="font-weight: bold; color: #000066;">boolean</span> usbCharge <span style="color: #339933;">=</span> chargePlug <span style="color: #339933;">==</span> BatteryManager.<span style="color: #006633;">BATTERY_PLUGGED_USB</span><span style="color: #339933;">;</span> <span style="font-weight: bold; color: #000066;">boolean</span> acCharge <span style="color: #339933;">=</span> chargePlug <span style="color: #339933;">==</span> BatteryManager.<span style="color: #006633;">BATTERY_PLUGGED_AC</span><span style="color: #339933;">;</span> </td> </tr> 通常你应该在使用交流电充电时最大化后台更新频率,在使用usb充电时降低,不充电时更低。 ...

2014年8月20日 · 4 分钟 · 天边的星星

Android DrawerLayout+ fragment 布局实现左右侧滑

技术要点: android.support.v4.widget.DrawerLayout 打开抽屉: DrawerLayout .openDrawer(); 关闭抽屉:DrawerLayout.closeDrawer( ); **为slidingLayout设置一个layout_grative属性 ** ** ** **中间![](http://www.2cto.com/uploadfile/Collfiles/20140226/20140226092627200.jpg) 左侧![](http://www.2cto.com/uploadfile/Collfiles/20140226/20140226092627201.jpg) 右侧 ![](http://www.2cto.com/uploadfile/Collfiles/20140226/20140226092627202.jpg) ** 点击first ![](http://www.2cto.com/uploadfile/Collfiles/20140226/20140226092627203.jpg) 点击second ![](http://www.2cto.com/uploadfile/Collfiles/20140226/20140226092628204.jpg) ** ** ** ** 代码: activity_main.xml <喎�”http://www.2cto.com/kf/ware/vc/” target=”_blank” class=”keylink”>vc3Ryb25nPjwvcD4KPHA+PHN0cm9uZz48L3N0cm9uZz48L3A+CjxwcmUgY2xhc3M9″brush:java;”><frameLayout android:id=”@+id/fragment_layout” android:layout_width=”fill_parent” android:layout_height=”fill_parent” > first.xml [?](http://www.2cto.com/kf/201402/281540.html#) <table style="font-weight: normal !important;" border="0" cellspacing="0" cellpadding="0"> <tr> <td class="gutter" style="color: #afafaf !important;"> <div class="line number1 index0 alt2"> 1 </div> <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"> `&lt;linearlayout xmlns:android=``"&lt;a href="http://schemas.android.com/apk/res/android">http://schemas.android.com/apk/res/android&lt;/a>"` `android:id=``"@+id/drawer_layout"` `android:layout_width=``"match_parent"` `android:layout_height=``"match_parent"` `android:orientation=``"vertical"``&gt;` </div> <div class="line number2 index1 alt1"> </div> <div class="line number3 index2 alt2"> ` ``&lt;textview android:id=``"@+id/textView1"` `android:layout_width=``"wrap_content"` `android:layout_height=``"wrap_content"` `android:text=``"first"` `android:textappearance=``"?android:attr/textAppearanceLarge"``&gt;` </div> <div class="line number4 index3 alt1"> ` ` </div> <div class="line number5 index4 alt2"> `&lt;/textview&gt;&lt;/linearlayout&gt;` </div> </div> </td> </tr> </table> ** second.xml** ...

2014年8月5日 · 13 分钟 · 天边的星星