214.m1-描述desc的动画

来源:互联网 发布:艾滋病现状最新数据 编辑:程序博客网 时间:2024/05/22 03:05

描述也需要动画,描述有2个部分一个是简要的描述只有7行,还有一个是完整的描述,简要的描述打开的时候会有一个值动画,关闭的时候也会有一个值动画。文字部分通过ScrollView来实现展开的时候自动滑动到最下面,注意获取到ScrollView对象的方法。

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;@Overrideprotected void initView() {System.out.println("3333" + view);LoadingPage loadingPage = new LoadingPage(this){@Overrideprotected LoadResult load() {return DetailActivity.this.load();}@Overridepublic View createSuccessView() {return DetailActivity.this.createSuccessView();}};System.out.println("4444" + view);loadingPage.show();setContentView(loadingPage);}@Overrideprotected 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();//创建holderdetailInfoHolder.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;}}@Overrideprotected void initActionBar() {super.initActionBar();//获取到actionBar,使用getSupportActionBar,getActionBar是android.app下面的getActionBarActionBar actionBar = getSupportActionBar();//图标的显示与隐藏,显示返回按钮actionBar.setDisplayHomeAsUpEnabled(true);}/*// 处理actionBar菜单条目的点击事件,实现点击图标来隐藏当前的界面     @Overridepublic boolean onOptionsItemSelected(MenuItem item) {System.out.println("所有");//当前点击的条目是searchif (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;//相对布局@Overridepublic View initView() {View view=UiUtils.inflate(R.layout.detail_des);ViewUtils.inject(this, view);return view;}@Overridepublic 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);//设置字体大小14dptextView.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;@Overridepublic void onClick(View v) {//获取到ScrollViewscrollView=getScrollView(des_layout);int startHeight;//起始高度int targetHeight;//目标高度if(!flag){//没有展开flag=true;startHeight=getShortMeasureHeight();targetHeight=getLongMeasureHeight();}else{//展开flag=false;startHeight=getLongMeasureHeight();targetHeight=getShortMeasureHeight();}//获取到LayoutParamsfinal LayoutParams layoutParams = des_content.getLayoutParams();ValueAnimator animator=ValueAnimator.ofInt(startHeight,targetHeight);// 监听值的变化animator.addUpdateListener(new AnimatorUpdateListener() {@Overridepublic 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() {  //当动画开始执行的时候调用@Overridepublic void onAnimationStart(Animator arg0) {// TODO Auto-generated method stub}@Overridepublic void onAnimationRepeat(Animator arg0) {}@Overridepublic void onAnimationEnd(Animator arg0) {if(flag){des_arrow.setImageResource(R.drawable.arrow_up);}else{des_arrow.setImageResource(R.drawable.arrow_down);}}@Overridepublic void onAnimationCancel(Animator arg0) {}});animator.setDuration(500);//设置动画持续时间animator.start();}//获取到ScrollViewprivate ScrollView getScrollView(View view) {//获取到当前对象的父容器ViewParent parent = view.getParent();//向父容器对象获取到ScrollView,如果没有再向上一级获取ScrollView,知道获取到ScrollView为止if(parent instanceof ViewGroup){ViewGroup group=(ViewGroup) parent;//返回ScrollViewif(group instanceof ScrollView){return (ScrollView)group;}else{return getScrollView(group);}}else{//获取到整个屏幕return null;}}}


原创粉丝点击