描述也需要动画,描述有2个部分一个是简要的描述只有7行,还有一个是完整的描述,简要的描述打开的时候会有一个值动画,关闭的时候也会有一个值动画。文字部分通过ScrollView来实现展开的时候自动滑动到最下面,注意获取到ScrollView对象的方法。
detail_des.xml详情描述布局文件
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/des_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="8dp" >
<TextView
android:id="@+id/des_titile"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:ellipsize="end"
android:singleLine="true"
android:text="@string/app_detail_introduction"
android:textColor="#3c3c3c"
android:textSize="14dp" />
<TextView
android:id="@+id/des_content"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/des_titile"
android:layout_marginTop="5dp"
android:textColor="#7a7a7a"
android:textSize="14dp"
/>
<RelativeLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/des_content"
android:layout_marginTop="5dp"
android:gravity="center_vertical" >
<TextView
android:id="@+id/des_author"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:singleLine="true"
android:textColor="#b3b3b3"
android:textSize="14dp" />
<ImageView
android:id="@+id/des_arrow"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_centerVertical="true"
android:scaleType="centerInside"
android:src="@drawable/arrow_down" />
</RelativeLayout>
</RelativeLayout>
DetailActivity.java
package com.ldw.market;
/*
* 左侧的详情页
*/
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.ActionBar;
import android.view.View;
import android.widget.FrameLayout;
import android.widget.HorizontalScrollView;
import com.ldw.market.domain.AppInfo;
import com.ldw.market.fragment.BaseFragment1;
import com.ldw.market.holder.DetailDesHolder;
import com.ldw.market.holder.DetailInfoHolder;
import com.ldw.market.holder.DetailSafeHolder;
import com.ldw.market.holder.DetailScreenHolder;
import com.ldw.market.protocol.DetailProtocol;
import com.ldw.market.utils.UiUtils;
import com.ldw.market.view.LoadingPage;
import com.ldw.market.view.LoadingPage.LoadResult;
public class DetailActivity extends BaseActivity{
private String packageName;
private AppInfo data;
@Override
protected void initView() {
System.out.println("3333" + view);
LoadingPage loadingPage = new LoadingPage(this){
@Override
protected LoadResult load() {
return DetailActivity.this.load();
}
@Override
public View createSuccessView() {
return DetailActivity.this.createSuccessView();
}
};
System.out.println("4444" + view);
loadingPage.show();
setContentView(loadingPage);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
System.out.println("1111" + view);
// 获取到打开当前activity的意图对象
Intent intent = getIntent();
//获取到传递过来的包名
packageName = intent.getStringExtra("packageName");
//再执行父类的方法
super.onCreate(savedInstanceState);
}
private FrameLayout bottom_layout,detail_info,detail_safe,detail_des;
private HorizontalScrollView detail_screen;
private DetailInfoHolder detailInfoHolder;
private DetailScreenHolder screenHolder;//图片
private DetailSafeHolder safeHolder;//安全
private DetailDesHolder desHolder;//界面的描述
private View view;
//加载成功的界面
protected View createSuccessView() {
view = View.inflate(UiUtils.getContext(), R.layout.activity_detail, null);
// 添加信息区域
bottom_layout=(FrameLayout) view.findViewById(R.id.bottom_layout);
// 操作 应用程序信息
detail_info=(FrameLayout) view.findViewById(R.id.detail_info);
detailInfoHolder=new DetailInfoHolder();//创建holder
detailInfoHolder.setData(data);//携带参数,传递到holder,调用refreshView方法
detail_info.addView(detailInfoHolder.getContentView());//holder中初始化布局
System.out.println("555555" + view);
//安全标记
detail_safe=(FrameLayout) view.findViewById(R.id.detail_safe);
safeHolder=new DetailSafeHolder();
safeHolder.setData(data);
detail_safe.addView(safeHolder.getContentView());
//界面描述
detail_des=(FrameLayout) view.findViewById(R.id.detail_des);
desHolder=new DetailDesHolder();
desHolder.setData(data);
detail_des.addView(desHolder.getContentView());
// 中间5张图片
detail_screen=(HorizontalScrollView) view.findViewById(R.id.detail_screen);
screenHolder=new DetailScreenHolder();
screenHolder.setData(data);
detail_screen.addView(screenHolder.getContentView());
return view;
}
//请求服务器加载数据
protected LoadResult load() {
//服务器请求包名的数据
DetailProtocol protocol=new DetailProtocol(packageName);
data = protocol.load(0);
System.out.println("555555data" + data);
if(data == null){
return LoadResult.error;
}else{
return LoadResult.success;
}
}
@Override
protected void initActionBar() {
super.initActionBar();
//获取到actionBar,使用getSupportActionBar,getActionBar是android.app下面的getActionBar
ActionBar actionBar = getSupportActionBar();
//图标的显示与隐藏,显示返回按钮
actionBar.setDisplayHomeAsUpEnabled(true);
}
/*
// 处理actionBar菜单条目的点击事件,实现点击图标来隐藏当前的界面
@Override
public boolean onOptionsItemSelected(MenuItem item) {
System.out.println("所有");
//当前点击的条目是search
if (item.getItemId() == android.R.id.home) {
finish();
}
return super.onOptionsItemSelected(item);
}
*/
}
DetailDesHolder.java
package com.ldw.market.holder;
import android.util.TypedValue;
import android.view.View;
import android.view.View.MeasureSpec;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.view.ViewGroup.LayoutParams;
import android.view.ViewParent;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.ScrollView;
import android.widget.TextView;
import com.ldw.market.R;
import com.ldw.market.domain.AppInfo;
import com.ldw.market.utils.UiUtils;
import com.lidroid.xutils.ViewUtils;
import com.lidroid.xutils.view.annotation.ViewInject;
import com.nineoldandroids.animation.Animator;
import com.nineoldandroids.animation.Animator.AnimatorListener;
import com.nineoldandroids.animation.ValueAnimator;
import com.nineoldandroids.animation.ValueAnimator.AnimatorUpdateListener;
public class DetailDesHolder extends BaseHolder<AppInfo> implements OnClickListener {
@ViewInject(R.id.des_content)
private TextView des_content;//描述的内容
@ViewInject(R.id.des_author)
private TextView des_author;//描述的作者
@ViewInject(R.id.des_arrow)
private ImageView des_arrow;//显示与隐藏的箭头
@ViewInject(R.id.des_layout)
private RelativeLayout des_layout;//相对布局
@Override
public View initView() {
View view=UiUtils.inflate(R.layout.detail_des);
ViewUtils.inject(this, view);
return view;
}
@Override
public void refreshView(AppInfo data) {
des_content.setText(data.getDes());
des_author.setText("作者:"+data.getAuthor());
des_layout.setOnClickListener(this);
//des_content 起始高度7行的高度,初始化页面的内容,是简要描述
LayoutParams layoutParams = des_content.getLayoutParams();
layoutParams.height=getShortMeasureHeight();
des_content.setLayoutParams(layoutParams);
des_arrow.setImageResource(R.drawable.arrow_down);
}
/*
* 获取7行的高度,简要的描述
*/
public int getShortMeasureHeight(){
// 复制一个新的TextView 用来测量,最好不要在之前的TextView测量 有可能影响其它代码执行
TextView textView=new TextView(UiUtils.getContext());
textView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 14);//设置字体大小14dp
textView.setMaxLines(7);
textView.setLines(7);// 强制有7行
int width=des_content.getMeasuredWidth(); // 开始宽度
int widthMeasureSpec=MeasureSpec.makeMeasureSpec(MeasureSpec.EXACTLY, width);
int heightMeasureSpec=MeasureSpec.makeMeasureSpec(MeasureSpec.AT_MOST, 1000);
textView.measure(widthMeasureSpec, heightMeasureSpec);
return textView.getMeasuredHeight();
}
/*
* 获取TextView 自己本身的高度,完整的desc文本
*/
public int getLongMeasureHeight(){
int width=des_content.getMeasuredWidth(); // 开始宽度
des_content.getLayoutParams().height= ViewGroup.LayoutParams.WRAP_CONTENT;// 高度包裹内容
int widthMeasureSpec=MeasureSpec.makeMeasureSpec(MeasureSpec.EXACTLY, width);
int heightMeasureSpec=MeasureSpec.makeMeasureSpec(MeasureSpec.AT_MOST, 1000);
des_content.measure(widthMeasureSpec,heightMeasureSpec);//
return des_content.getMeasuredHeight();
}
boolean flag;// true展开了 false 没有展开
ScrollView scrollView;
@Override
public void onClick(View v) {
//获取到ScrollView
scrollView=getScrollView(des_layout);
int startHeight;//起始高度
int targetHeight;//目标高度
if(!flag){//没有展开
flag=true;
startHeight=getShortMeasureHeight();
targetHeight=getLongMeasureHeight();
}else{//展开
flag=false;
startHeight=getLongMeasureHeight();
targetHeight=getShortMeasureHeight();
}
//获取到LayoutParams
final LayoutParams layoutParams = des_content.getLayoutParams();
ValueAnimator animator=ValueAnimator.ofInt(startHeight,targetHeight);
// 监听值的变化
animator.addUpdateListener(new AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
int value=(Integer) animation.getAnimatedValue();
//更新高度
layoutParams.height=value;
//更新视图
des_content.setLayoutParams(layoutParams);
scrollView.scrollTo(0, scrollView.getMeasuredHeight());// 让scrollView 移动到最下面
}
});
// 监听动画执行,切换箭头
animator.addListener(new AnimatorListener() {
//当动画开始执行的时候调用
@Override
public void onAnimationStart(Animator arg0) {
// TODO Auto-generated method stub
}
@Override
public void onAnimationRepeat(Animator arg0) {
}
@Override
public void onAnimationEnd(Animator arg0) {
if(flag){
des_arrow.setImageResource(R.drawable.arrow_up);
}else{
des_arrow.setImageResource(R.drawable.arrow_down);
}
}
@Override
public void onAnimationCancel(Animator arg0) {
}
});
animator.setDuration(500);//设置动画持续时间
animator.start();
}
//获取到ScrollView
private ScrollView getScrollView(View view) {
//获取到当前对象的父容器
ViewParent parent = view.getParent();
//向父容器对象获取到ScrollView,如果没有再向上一级获取ScrollView,知道获取到ScrollView为止
if(parent instanceof ViewGroup){
ViewGroup group=(ViewGroup) parent;
//返回ScrollView
if(group instanceof ScrollView){
return (ScrollView)group;
}else{
return getScrollView(group);
}
}else{
//获取到整个屏幕
return null;
}
}
}
实现下面的三个按钮
detail_bottom.xml下面的按钮的布局
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/bottom_layout"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<!-- 详情页下方的按钮 -->
<Button
android:id="@+id/bottom_favorites"
android:layout_width="68dp"
android:layout_height="38dp"
android:layout_alignParentLeft="true"
android:layout_margin="6dp"
android:background="@drawable/detail_btn"
android:gravity="center"
android:textColor="#ffffff"
android:textSize="16dp"
android:text="收藏"
/>
<Button
android:id="@+id/bottom_share"
android:layout_width="68dp"
android:layout_height="38dp"
android:layout_alignParentRight="true"
android:layout_margin="6dp"
android:background="@drawable/detail_btn"
android:gravity="center"
android:textColor="#ffffff"
android:textSize="16dp"
android:text="分享"/>
<!-- <FrameLayout
android:visibility="gone"
android:id="@+id/progress_layout"
android:layout_width="match_parent"
android:layout_height="38dp"
android:layout_centerVertical="true"
android:layout_toLeftOf="@id/bottom_share"
android:layout_toRightOf="@id/bottom_favorites" >
<ProgressBar
android:id="@+id/pb_load_process"
style="?android:attr/progressBarStyleHorizontal"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/progress_bg"
android:progressDrawable="@drawable/progress_drawable"
android:visibility="invisible" />
<TextView
android:id="@+id/tv_load_process"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:text="暂停"
android:textColor="#ffffff"
android:textSize="18sp" />
</FrameLayout> -->
<Button
android:id="@+id/progress_btn"
android:layout_width="match_parent"
android:layout_height="38dp"
android:layout_centerVertical="true"
android:layout_toLeftOf="@id/bottom_share"
android:layout_toRightOf="@id/bottom_favorites"
android:background="@drawable/progress_btn"
android:gravity="center"
android:textColor="#ffffff"
android:textSize="18dp"
android:text="下载">
</Button>
</RelativeLayout>
DetailBottomHolder.java三个按钮的Holder逻辑
package com.ldw.market.holder;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;
import com.ldw.market.R;
import com.ldw.market.domain.AppInfo;
import com.ldw.market.utils.UiUtils;
import com.lidroid.xutils.ViewUtils;
import com.lidroid.xutils.view.annotation.ViewInject;
public class DetailBottomHolder extends BaseHolder<AppInfo> implements OnClickListener{
@ViewInject(R.id.bottom_favorites)
Button bottom_favorites;//喜爱
@ViewInject(R.id.bottom_share)
Button bottom_share;//分享
@ViewInject(R.id.progress_btn)
Button progress_btn;//下载
//填充布局
@Override
public View initView() {
View view=UiUtils.inflate(R.layout.detail_bottom);
ViewUtils.inject(this, view);
return view;
}
@Override
public void refreshView(AppInfo data) {
//添加点击事件
bottom_favorites.setOnClickListener(this);
bottom_share.setOnClickListener(this);
progress_btn.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.bottom_favorites:
Toast.makeText(UiUtils.getContext(), "收藏", 0).show();
break;
case R.id.bottom_share:
Toast.makeText(UiUtils.getContext(), "分享", 0).show();
break;
case R.id.progress_btn:
Toast.makeText(UiUtils.getContext(), "下载", 0).show();
break;
}
}
}
DetailActivity.java应用详情页的大布局
package com.ldw.market;
/*
* 左侧的详情页
*/
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.ActionBar;
import android.view.View;
import android.widget.FrameLayout;
import android.widget.HorizontalScrollView;
import com.ldw.market.domain.AppInfo;
import com.ldw.market.fragment.BaseFragment1;
import com.ldw.market.holder.DetailBottomHolder;
import com.ldw.market.holder.DetailDesHolder;
import com.ldw.market.holder.DetailInfoHolder;
import com.ldw.market.holder.DetailSafeHolder;
import com.ldw.market.holder.DetailScreenHolder;
import com.ldw.market.protocol.DetailProtocol;
import com.ldw.market.utils.UiUtils;
import com.ldw.market.view.LoadingPage;
import com.ldw.market.view.LoadingPage.LoadResult;
public class DetailActivity extends BaseActivity{
private String packageName;
private AppInfo data;
@Override
protected void initView() {
System.out.println("3333" + view);
LoadingPage loadingPage = new LoadingPage(this){
@Override
protected LoadResult load() {
return DetailActivity.this.load();
}
@Override
public View createSuccessView() {
return DetailActivity.this.createSuccessView();
}
};
System.out.println("4444" + view);
loadingPage.show();
setContentView(loadingPage);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
System.out.println("1111" + view);
// 获取到打开当前activity的意图对象
Intent intent = getIntent();
//获取到传递过来的包名
packageName = intent.getStringExtra("packageName");
//再执行父类的方法
super.onCreate(savedInstanceState);
}
private FrameLayout bottom_layout,detail_info,detail_safe,detail_des;
private HorizontalScrollView detail_screen;
private DetailInfoHolder detailInfoHolder;
private DetailScreenHolder screenHolder;//图片
private DetailSafeHolder safeHolder;//安全
private DetailDesHolder desHolder;//界面的描述
private DetailBottomHolder bottomHolder;//最下方的按钮
private View view;
//加载成功的界面
protected View createSuccessView() {
view = View.inflate(UiUtils.getContext(), R.layout.activity_detail, null);
// 添加信息区域
bottom_layout=(FrameLayout) view.findViewById(R.id.bottom_layout);
//最下方的按钮部分
bottomHolder=new DetailBottomHolder();
bottomHolder.setData(data);
bottom_layout.addView(bottomHolder.getContentView());
// 操作 应用程序信息
detail_info=(FrameLayout) view.findViewById(R.id.detail_info);
detailInfoHolder=new DetailInfoHolder();//创建holder
detailInfoHolder.setData(data);//携带参数,传递到holder,调用refreshView方法
detail_info.addView(detailInfoHolder.getContentView());//holder中初始化布局
System.out.println("555555" + view);
//安全标记
detail_safe=(FrameLayout) view.findViewById(R.id.detail_safe);
safeHolder=new DetailSafeHolder();
safeHolder.setData(data);
detail_safe.addView(safeHolder.getContentView());
//界面描述
detail_des=(FrameLayout) view.findViewById(R.id.detail_des);
desHolder=new DetailDesHolder();
desHolder.setData(data);
detail_des.addView(desHolder.getContentView());
// 中间5张图片
detail_screen=(HorizontalScrollView) view.findViewById(R.id.detail_screen);
screenHolder=new DetailScreenHolder();
screenHolder.setData(data);
detail_screen.addView(screenHolder.getContentView());
return view;
}
//请求服务器加载数据
protected LoadResult load() {
//服务器请求包名的数据
DetailProtocol protocol=new DetailProtocol(packageName);
data = protocol.load(0);
System.out.println("555555data" + data);
if(data == null){
return LoadResult.error;
}else{
return LoadResult.success;
}
}
@Override
protected void initActionBar() {
super.initActionBar();
//获取到actionBar,使用getSupportActionBar,getActionBar是android.app下面的getActionBar
ActionBar actionBar = getSupportActionBar();
//图标的显示与隐藏,显示返回按钮
actionBar.setDisplayHomeAsUpEnabled(true);
}
/*
// 处理actionBar菜单条目的点击事件,实现点击图标来隐藏当前的界面
@Override
public boolean onOptionsItemSelected(MenuItem item) {
System.out.println("所有");
//当前点击的条目是search
if (item.getItemId() == android.R.id.home) {
finish();
}
return super.onOptionsItemSelected(item);
}
*/
}