- 浏览: 5781513 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (890)
- WindowsPhone (0)
- android (88)
- android快速迭代 (17)
- android基础 (34)
- android进阶 (172)
- android高级 (0)
- android拾遗 (85)
- android动画&效果 (68)
- Material Design (13)
- LUA (5)
- j2me (32)
- jQuery (39)
- spring (26)
- hibernate (20)
- struts (26)
- tomcat (9)
- javascript+css+html (62)
- jsp+servlet+javabean (14)
- java (37)
- velocity+FCKeditor (13)
- linux+批处理 (9)
- mysql (19)
- MyEclipse (9)
- ajax (7)
- wap (8)
- j2ee+apache (24)
- 其他 (13)
- phonegap (35)
最新评论
-
Memories_NC:
本地lua脚本终于执行成功了,虽然不是通过redis
java中调用lua脚本语言1 -
ZHOU452840622:
大神://处理返回的接收状态 这个好像没有监听到 遇 ...
android 发送短信的两种方式 -
PXY:
拦截部分地址,怎么写的for(int i=0;i<lis ...
判断是否登录的拦截器SessionFilter -
maotou1988:
Android控件之带清空按钮(功能)的AutoComplet ...
自定义AutoCompleteTextView -
yangmaolinpl:
希望有表例子更好。。。,不过也看明白了。
浅谈onInterceptTouchEvent、onTouchEvent与onTouch
这是我们的美工MM画的,偶的神呐,这虽然很漂亮,不过也让人头疼,这个箭头应该在滚到顶部的时候消失,滚下来的时候(即有条目隐藏的时候)才显示,类似的底部指示器也要有这样的效果。事实上默认的ListView和ScrollView都已经有了类似的效果,在顶部或底部还有更多内容时,会有部分渐变虚化的效果,不过美工已经设计了这样的效果,那么我们就来做吧。
出于省事的目的,本教程中的例子会基于上一篇教程来修改,主要是添加1个继承自ListView的类,以及修改布局定义文件。
ArrowListView控件的编写:
import net.learningandroid.lib.R; import android.content.Context; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Paint; import android.graphics.Rect; import android.graphics.drawable.BitmapDrawable; import android.util.AttributeSet; import android.util.Log; import android.view.View; import android.widget.ListView; /** * 支持上下箭头的ListView * * @author Mr. Lu */ public class ArrowListView extends ListView { private final float scale = getContext().getResources().getDisplayMetrics().density; private float topArrowPadding; private float bottomArrowPadding; private static float DEFAULT_TOP_PADDING_DP = 2.0f; private static float DEFAULT_BOTTOM_PADDING_DP = 2.0f; public ArrowListView(Context context, AttributeSet attrs) { super(context, attrs); String strTopArrowPadding = attrs.getAttributeValue(null, "topArrowPadding"); String strBottomArrowPadding = attrs.getAttributeValue(null, "bottomArrowPadding"); topArrowPadding = convertDisplayUom(strTopArrowPadding, DEFAULT_TOP_PADDING_DP); bottomArrowPadding = convertDisplayUom(strBottomArrowPadding, DEFAULT_BOTTOM_PADDING_DP); Log.v("ArrowListView", String.valueOf(topArrowPadding)); } /** * 单位转换 */ private float convertDisplayUom(String sour, float defaultValue) { try { if (sour.toLowerCase().endsWith("px")) { return Float.parseFloat(sour.toLowerCase().replace("px", "")); } else if (sour.toLowerCase().endsWith("dp")) { return Integer.parseInt(sour.toLowerCase().replace("dp", "")) * scale + 0.5f; } } catch (Exception e) { } return (defaultValue * scale + 0.5f); } /** * onDraw方法,根据ListView滚动位置绘出箭头. */ @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); Paint paint = new Paint(); // 取得箭头的图片,此处是固定图片,其实上可以做成配置方式 Bitmap topPic = ((BitmapDrawable) getResources().getDrawable( R.drawable.arrow_up)).getBitmap(); Bitmap bottomPic = ((BitmapDrawable) getResources().getDrawable( R.drawable.arrow_down)).getBitmap(); // 取得ListView的绘制区域大小 Rect r = new Rect(); this.getDrawingRect(r); // 计算箭头的绘制位置 float top = r.top + topArrowPadding; float bottom = r.bottom - bottomArrowPadding - bottomPic.getHeight(); float left = r.left + (r.right - r.left - topPic.getWidth()) / 2; // 计算是否需要绘制 boolean drawTop = false; boolean drawBottom = false; if (this.getChildCount() > 0) { Rect rTop = new Rect(); this.getChildAt(0).getLocalVisibleRect(rTop); Rect rBottom = new Rect(); View lastChild = this.getChildAt(this.getChildCount() - 1); lastChild.getLocalVisibleRect(rBottom); drawTop = (this.getFirstVisiblePosition() > 0 || this .getFirstVisiblePosition() == 0 && rTop.top > 0); drawBottom = (this.getLastVisiblePosition() < this.getAdapter() .getCount() - 1 || this.getLastVisiblePosition() == this .getAdapter().getCount() - 1 && rBottom.bottom < lastChild.getHeight()); } // 绘出箭头 if (drawTop) { canvas.drawBitmap(topPic, left, top, paint); } if (drawBottom) { canvas.drawBitmap(bottomPic, left, bottom, paint); } } }
就要点解释一下上面这段代码:
注意构造方法,我们必须继承public ArrowListView(Context context, AttributeSet attrs),这样才可以让这个类在xml定义文件中使用。
还要注意到,这里用了attrs.getAttributeValue来读取XML定义文件中的属性,其实有更好的方法,容我下次再讲解,这里先偷个懒。
convertDisplayUom方法是用来将dp转换成px的,可以看到由于我们用了getAttributeValue的方式,所以需要手动将String转成Float,很麻烦。
最后就是onDraw啦,计算出画箭头的位置,画出来就行了。
接下来就是布局文件的编写了
ArrowListView在XML文件中的使用:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <TextView android:text="Arrow List View Sample" android:layout_width="fill_parent" android:layout_height="wrap_content" /> <net.learningandroid.lib.view.ArrowListView android:id="@+id/arrowListView" android:layout_width="fill_parent" android:layout_height="wrap_content" android:paddingTop="15dp" android:paddingBottom="20dp" android:layout_margin="10dp" android:background="@drawable/float_panel" android:layout_weight="1" android:cacheColorHint="#FFEDEDED" android:divider="#00EDEDED" topArrowPadding="5dp" bottomArrowPadding="10dp" /> </LinearLayout>
这里需要注意的是自定义控件和其中的属性的写法,不再是ListView了,而是你自己编写的控件类的类名。其它的内容就是定义padding,background,以及取消了分隔线的显示。
用这个布局文件替代上一篇教程中的布局文件,但Adapter的定义不变,因为ArrowListView是继承自ListView的,所以原先的Adapter的使用是一样的。
最后我们来看下效果:
如何?只需要小心的调整ListView的Padding和ArrowPadding的值就可以控制箭头出现的位置,如果需要控制更多,比如更换图片,或者当顶部无内容时让箭头变暗、有内容时变亮,都可以用同样的方法。
并且,如果修改了Attribute的读取方法之后,还可以通过xml文件来指定箭头的图片。关于这部分,后面会再介绍,敬请关注。
发表评论
-
NestedScrollView滚动到顶部固定子View悬停挂靠粘在顶端
2018-10-31 20:45 6819网上有一个StickyScrollView,称之为粘性Scro ... -
自定义Behavior实现AppBarLayout越界弹性效果
2017-03-31 09:33 10252一、继承AppBarLayout.Beha ... -
Android - 一种相似图片搜索算法的实现
2017-03-31 09:33 2573算法 缩小尺寸。 将图片缩小到8x8的尺寸,总共64个 ... -
使用SpringAnimation实现带下拉弹簧动画的 ScrollView
2017-03-30 11:30 2798在刚推出的 Support Library 25.3.0 里面 ... -
Android为应用添加角标(Badge)
2017-03-30 11:21 61121.需求简介 角标是什么意思呢? 看下图即可明了: 可 ... -
Android端与笔记本利用局域网进行FTP通信
2017-03-23 10:17 934先看图 打开前: 打开后: Activity类 ... -
PorterDuffColorFilter 在项目中的基本使用
2017-03-03 10:58 1305有时候标题栏会浮在内容之上,而内容会有颜色的变化,这时候就要求 ... -
ColorAnimationView 实现了滑动Viewpager 时背景色动态变化的过渡效果
2017-02-24 09:41 2178用法在注释中: import android.anima ... -
迷你轻量级全方向完美滑动处理侧滑控件SlideLayout
2017-01-16 16:53 2553纯手工超级迷你轻量级全方向完美滑动处理侧滑控件(比官方 sup ... -
Effect
2017-01-05 09:57 0https://github.com/JetradarMobi ... -
动态主题库Colorful,容易地改变App的配色方案
2016-12-27 14:49 2529Colorful是一个动态主题库,允许您很容易地改变App的配 ... -
对视图的对角线切割DiagonalView
2016-12-27 14:23 1077提供对视图的对角线切割,具有很好的用户定制 基本用法 ... -
仿淘宝京东拖拽商品详情页上下滚动黏滞效果
2016-12-26 16:53 3425比较常用的效果,有现成的,如此甚好!:) import ... -
让任意view具有滑动效果的SlideUp
2016-12-26 09:26 1668基本的类,只有一个: import android.a ... -
AdvancedWebView
2016-12-21 09:44 16https://github.com/delight-im/A ... -
可设置圆角背景边框的按钮, 通过调节色彩明度自动计算按下(pressed)状态颜色
2016-11-02 22:13 1868可设置圆角背景边框的的按钮, 通过调节色彩明度自动计算按下(p ... -
网络请求库相关
2016-10-09 09:35 62https://github.com/amitshekhari ... -
ASimpleCache一个简单的缓存框架
2015-10-26 22:53 2128ASimpleCache 是一个为android制定的 轻量级 ... -
使用ViewDragHelper实现的DragLayout开门效果
2015-10-23 10:55 3350先看一下图,有个直观的了解,向下拖动handle就“开门了”: ... -
保证图片长宽比的同时拉伸图片ImageView
2015-10-16 15:40 3683按比例放大图片,不拉伸失真 import android. ...
相关推荐
android UI进阶之实现listview中checkbox的多选与记录
androidUI进阶之实现listview的下拉加载.pdf
android_UI进阶之实现listview的下拉加载,实用简单
viewpage嵌套listview,效果:滑动listview删除,滑动非listview区域viewpage翻页
Android:弹性ListView
需求如题目:Android listview中item部分区域添加点击事件,在一个界面显示了listview,但显示的内容分为上下两部分,分别是白色的背景和蓝色的背景,现在需要只点击蓝色的背景,才能跳转到其他界面,解决方式如下:...
Android 自定义ListView实现底部分页刷新与顶部下拉刷新 一.ListView 底部分页加载 整个底部分页加载,主要分一下几步: 1.加载底部自定义View; 2.响应OnScrollListener监听事件,onScroll方法记录最后可见的View ...
该文档详细介绍了listView的分页加载
基于ListView实现头部、底部视差效果
通过对ListView的运用,实现仿QQ的消息列表。涉及内容:ListView,Adapter
带箭头排序的ListView示例,排序时按照各列设置的数据类型进行
在PopupWindow中嵌入ListView,ListView中的item可在顶部与底部之间跳跃.
Android 实现ListView滚动到底部自动加载数据
WPF 在listview中如何实现Combobox的下拉菜单绑定Demo C# WPF ListView
关于listview的操作五花八门,有下拉刷新,分级显示,分页列表,逐页加载等,以后会陆续和大家分享这些技术,今天讲下下拉加载这个功能的实现。最初的下拉加载应该是ios上的效果,现在很多应用如新浪微博等都加入了...
ListView 中实现可编辑文本或双击出现下拉列表框 重写listview空间,在控件中添加下拉框和文本框
本程序为Delphi中的ListView列表定制箭头及表头布局,可以让表头的文字靠左或者靠或显示,为表头增加一个箭头指示,老生长谈的问题,有喜欢的可拿去,纯Delphi代码实现,可以直接在D7编译,运行效果如上。
主要介绍了ListView实现顶部和底部内容指示器的方法,需要的朋友可以参考下
Android为ListView添加圆角边框效果,安卓UI设计的例子,默认情况下ListView的外框是直角的,也就是大家习惯的样式,但为了美化更突出,或者与你的应用风格更吻合,有时候可能修饰成圆角边框,本例子就是实现了这一...
HorizontalListView的应用:Listview中完美嵌套HorizontalListView