常用的View(一)——标题栏渐变、伸缩的TextView、圆形头像、选图截图等功能的实现
2016-04-08 22:39
330 查看
本例主要汇总了一些常用的view,如
标题栏随滚动逐渐显现
自动轮播图
圆形头像
可伸缩的TextView
选取相机中的图片并截图
demo示例:
实现原理:设置滚动监听,不断更新标题栏的透明度
规则:
当头布局处于完全显示状态,设置标题栏透明度为完全透明
当头布局处于完全显示和完全隐藏之间,动态设置标题栏透明度
当头布局处于完全隐藏状态,设置标题栏透明度为完全不透明
使用expandableTextView属性要先添加
xmlns:expandableTextView=”http://schemas.android.com/apk/res-auto”
同时还有一些属性需要注意
maxCollapsedLines:当TextView收缩时最大显示text的行数,默认为8行
animDuration:当TextView展开和收缩时,动画持续时间,默认300ms
animAlphaStart:动画开始时的透明度,默认为0.7,如果不想要透明度的变化,可以设为1
expandDrawable:收缩后显示的图片,不设置则默认显示的向下箭头
collapseDrawable:展开后显示的图片,不设置则默认显示向上的箭头
在代码中使用就和ImageView一样
回调方法
demo下载地址
http://download.csdn.net/detail/benhuo931115/9485511
标题栏随滚动逐渐显现
自动轮播图
圆形头像
可伸缩的TextView
选取相机中的图片并截图
demo示例:
下面分别介绍这些功能的实现:
滚动屏幕标题栏渐变
根据屏幕的滚动,顶部标题栏逐渐由完全透明变成完全不透明实现原理:设置滚动监听,不断更新标题栏的透明度
规则:
当头布局处于完全显示状态,设置标题栏透明度为完全透明
当头布局处于完全显示和完全隐藏之间,动态设置标题栏透明度
当头布局处于完全隐藏状态,设置标题栏透明度为完全不透明
主要代码
View headView = View.inflate(this, R.layout.auto_scrollview, null); //listview添加头布局(轮播图) listview.addHeaderView(headView); //listview设置滚动监听 listview.setOnScrollListener(new TitleOnScrollListener()); class TitleOnScrollListener implements AbsListView.OnScrollListener { @Override public void onScrollStateChanged(AbsListView view, int scrollState) { } /** * 当listview滚动时回调 * * @param view * @param firstVisibleItem * @param visibleItemCount * @param totalItemCount */ @Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { if (firstVisibleItem == 0) {//当第一个显示的Item为0时(即轮播图显示时) // 获取头布局 View headView = listview.getChildAt(0); if (headView != null) { // 获取头布局现在的最上部的位置的相反数(即头布局滑出屏幕的高度) int top = -headView.getTop(); // 获取头布局的高度 int headerHeight = headView.getHeight(); // 满足这个条件的时候,即是头布局未完全显示,只有这个时候,我们才调整透明度 if (top <= headerHeight && top >= 0) { // 获取当前位置占头布局高度的百分比 float f = (float) top / (float) headerHeight; float temp; if (f < 0.7f) { temp = 1.43f * f; } else { temp = 1; } //设置头布局的透明度 rl_title.getBackground().setAlpha((int) (temp * 255)); // 通知标题栏刷新显示 rl_title.invalidate(); } } } else if (firstVisibleItem > 0) { //当轮播图完成显示就将标题栏透明度设为完全不透明 rl_title.getBackground().setAlpha(255); } else { //将标题栏设为完全透明 rl_title.getBackground().setAlpha(0); } } }
轮播图
这里用到了github上的一个自动轮播图框架android-auto-scroll-view-pager,具体的使用方法可以看我之前的一篇博客android-auto-scroll-view-pager-master的使用,这里就不再赘述。可伸缩的TextView
这里使用的github上的一个开源框架ExpandableTextView,使用方法也非常简单1.在build.gradle中添加
dependencies { compile 'com.ms-square:expandableTextView:0.1.4' }
2.在布局文件中定义
<com.ms.square.android.expandabletextview.ExpandableTextView xmlns:android="http://schemas.android.com/apk/res/android" xmlns:expandableTextView="http://schemas.android.com/apk/res-auto" android:id="@+id/expand_text_view" android:layout_width="match_parent" android:layout_height="wrap_content" expandableTextView:maxCollapsedLines="4" expandableTextView:animDuration="200"> <TextView android:id="@id/expandable_text" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginLeft="10dp" android:layout_marginRight="10dp" android:textSize="16sp" android:textColor="#666666" /> <ImageButton android:id="@id/expand_collapse" android:layout_width="wrap_content" android:layout_height="wrap_content" android:padding="16dp" android:layout_gravity="right|bottom" android:background="@android:color/transparent"/> </com.ms.square.android.expandabletextview.ExpandableTextView>
注意:(笔者在使用过程中发现ExpandableTextView的父布局必须是LinearLayout,并且方向必须是vertical才会起作用,如果错误,请指正)
另外,这里的TextView和ImageButton必须设置为”@id/expandable_text”和”@id/expand_collapse”使用expandableTextView属性要先添加
xmlns:expandableTextView=”http://schemas.android.com/apk/res-auto”
同时还有一些属性需要注意
maxCollapsedLines:当TextView收缩时最大显示text的行数,默认为8行
animDuration:当TextView展开和收缩时,动画持续时间,默认300ms
animAlphaStart:动画开始时的透明度,默认为0.7,如果不想要透明度的变化,可以设为1
expandDrawable:收缩后显示的图片,不设置则默认显示的向下箭头
collapseDrawable:展开后显示的图片,不设置则默认显示向上的箭头
3.代码中使用(非常简单,直接初始化后设置文本就可以了):
ExpandableTextView expTv1 = (ExpandableTextView) rootView.findViewById(R.id.sample1) .findViewById(R.id.expand_text_view); expTv1.setText(getString(R.string.dummy_text1));
圆形头像
这里还是用到了github上的一个开源框架CircleImageView,使用时只需要在布局文件中定义就行了<de.hdodenhof.circleimageview.CircleImageView xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/civ_portrait" android:layout_width="50dp" android:layout_height="50dp" android:layout_marginLeft="10dp" android:src="@drawable/pic_null" app:civ_border_color="#FF000000" app:civ_border_width="2dp" /> <!-- civ_border_color 代码边框的颜色--!> <!-- civ_border_width 边框的宽度--!>
在代码中使用就和ImageView一样
civ_portrait.setImageResource(R.drawable.pic_null);
选取图片&截图
这里用的是github上的android-crop,非常好用的一个图片截取框架,并且自带了选择手机中图片等功能,使用方法也非常简单1.在manifest中添加如下代码
<activity android:name="com.soundcloud.android.crop.CropImageActivity" />
2.在build.gradle中添加
compile 'com.soundcloud.android:android-crop:1.0.1@aar'
3.进入选择图片的Activity,这里是通过隐式意图启动(new Intent(Intent.ACTION_GET_CONTENT).setType(“image/*”))
Crop.pickImage(activity)
4.裁剪的方法
//保存路径 Uri destination = Uri.fromFile(new File(getCacheDir(), "cropped")); Crop.of(source, destination).asSquare().start(this);
5.裁剪后的回调,可以在这里进行一些操作
@Override protected void onActivityResult(int requestCode, int resultCode, Intent result) { if (requestCode == Crop.REQUEST_CROP && resultCode == RESULT_OK) { //可以通过setImageURI设置图片 imageView.setImageURI(result.getData()); } }
本demo中实现主要代码如下:
getView()方法中,设置点击监听,裁剪图片holder.civ_portrait.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//进入选择图片裁剪的Activity
Crop.pickImage(MainActivity.this);
//记录当前点击的位置
clickPos = position;
}
});
//解决头像的复用问题,设置默认的头像
holder.civ_portrait.setImageResource(R.drawable.pic_null);if (output != null && clickPos == position) {
holder.civ_portrait.setImageURI(output);
}
回调方法
/** * 裁剪后的回调 * * @param requestCode * @param resultCode * @param result */ @Override protected void onActivityResult(int requestCode, int resultCode, Intent result) { if (requestCode == Crop.REQUEST_PICK && resultCode == RESULT_OK) { beginCrop(result.getData()); } else if (requestCode == Crop.REQUEST_CROP) { handleCrop(resultCode, result); } } private void beginCrop(Uri source) { Uri destination = Uri.fromFile(new File(getCacheDir(), "cropped")); Crop.of(source, destination).asSquare().start(this); } private Uri output; private void handleCrop(int resultCode, Intent result) { if (resultCode == RESULT_OK) { output = Crop.getOutput(result); if (adapter != null) { adapter.notifyDataSetChanged();//更新列表 } } else if (resultCode == Crop.RESULT_ERROR) { Toast.makeText(this, Crop.getError(result).getMessage(), Toast.LENGTH_SHORT).show(); } }
demo下载地址
http://download.csdn.net/detail/benhuo931115/9485511
相关文章推荐
- 使用UpdLock来扣减库存
- 4.1-ansible实例-安装nginx上
- 第一篇博客
- 图像分割——区域生长法
- 全国首堂沉浸式教学系统实验课开启了虚拟现实教育的新纪元
- Mybatis入门配置及基本查询
- cocos2d-x 3.x pageView的使用
- 使用Android studio 出现的问题解决
- FMDB 操作数据库
- mysql 命令大全
- [转载]基于Matlab的标记分水岭分割算法
- 关于vector大小(size)和容量(capacity)总结
- 剑指OFFER的跳台阶问题
- handle机制
- VIM 高效操作
- 京东笔试题
- lintcode:Word Ladder II
- 《JAVA并发编程实践》学习笔记(第六.七章)
- UVA_10422_Knights in FEN
- 送给搭档的“汉堡”