本例主要汇总了一些常用的view,如
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的使用,这里就不再赘述。
这里使用的github上的一个开源框架ExpandableTextView,使用方法也非常简单
dependencies {
compile 'com.ms-square:expandableTextView:0.1.4'
}
<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>
另外,这里的TextView和ImageButton必须设置为”@id/expandable_text”和”@id/expand_collapse”
使用expandableTextView属性要先添加
xmlns:expandableTextView=”http://schemas.android.com/apk/res-auto”
同时还有一些属性需要注意
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,非常好用的一个图片截取框架,并且自带了选择手机中图片等功能,使用方法也非常简单
<activity android:name="com.soundcloud.android.crop.CropImageActivity" />
compile 'com.soundcloud.android:android-crop:1.0.1@aar'
Crop.pickImage(activity)
//保存路径
Uri destination = Uri.fromFile(new File(getCacheDir(), "cropped"));
Crop.of(source, destination).asSquare().start(this);
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent result) {
if (requestCode == Crop.REQUEST_CROP && resultCode == RESULT_OK) {
//可以通过setImageURI设置图片
imageView.setImageURI(result.getData());
}
}
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