博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android 自定义View修炼-自定义可动画展开收缩View的实现
阅读量:5070 次
发布时间:2019-06-12

本文共 5461 字,大约阅读时间需要 18 分钟。

有时候需要点击一个view可以动画展开和收缩折叠一个View这样的效果,这样就可以直接自定义View来实现。

本例中,采用继承FrameLayout来实现自定义的ExpandView。下面将详细介绍各个部分来实现该类以及如何使用该自定义视图。

效果图如下:

未展开效果:

正在向上折叠收缩中的效果:

已经展开效果:

自定义展开类:ExpandView的实现:

package com.czm.customview;import android.content.Context;import android.util.AttributeSet;import android.view.LayoutInflater;import android.view.View;import android.view.animation.Animation;import android.view.animation.AnimationUtils;import android.widget.FrameLayout;import android.widget.LinearLayout;public class ExpandView extends FrameLayout{        private Animation mExpandAnimation;    private Animation mCollapseAnimation;    private boolean mIsExpand;        public ExpandView(Context context) {        this(context,null);        // TODO Auto-generated constructor stub    }    public ExpandView(Context context, AttributeSet attrs) {        this(context, attrs,0);        // TODO Auto-generated constructor stub    }    public ExpandView(Context context, AttributeSet attrs, int defStyle) {        super(context, attrs, defStyle);        // TODO Auto-generated constructor stub        initExpandView();    }    private void initExpandView() {        LayoutInflater.from(getContext()).inflate(R.layout.layout_expand, this, true);                mExpandAnimation = AnimationUtils.loadAnimation(getContext(), R.anim.expand);        mExpandAnimation.setAnimationListener(new Animation.AnimationListener() {            @Override            public void onAnimationStart(Animation animation) {                // TODO Auto-generated method stub            }                        @Override            public void onAnimationRepeat(Animation animation) {                // TODO Auto-generated method stub            }                        @Override            public void onAnimationEnd(Animation animation) {                setVisibility(View.VISIBLE);            }        });                mCollapseAnimation = AnimationUtils.loadAnimation(getContext(), R.anim.collapse);        mCollapseAnimation.setAnimationListener(new Animation.AnimationListener() {                        @Override            public void onAnimationStart(Animation animation) {                // TODO Auto-generated method stub            }                        @Override            public void onAnimationRepeat(Animation animation) {                // TODO Auto-generated method stub            }                        @Override            public void onAnimationEnd(Animation animation) {                setVisibility(View.INVISIBLE);            }        });            }    public void collapse() {        if (mIsExpand) {            mIsExpand = false;            clearAnimation();            startAnimation(mCollapseAnimation);        }    }        public void expand() {        if (!mIsExpand) {            mIsExpand = true;            clearAnimation();            startAnimation(mExpandAnimation);        }    }    public boolean isExpand() {        return mIsExpand;    }        public void setContentView(){        View view = null;            view = LayoutInflater.from(getContext()).inflate(R.layout.layout_expand, null);        removeAllViews();        addView(view);    }}

对应的ui配置文件:layout_expand.xml的实现:

展开动画代码:

<?xml version="1.0" encoding="utf-8"?>

<set xmlns:android="http://schemas.android.com/apk/res/android" >

<scale

android:duration="200"
android:fromXScale="1."
android:fromYScale=".0"
android:pivotX="50%"
android:pivotY="0%"
android:toXScale="1."
android:toYScale="1." />

</set>

收缩叠起代码:

如何使用上面自定义的ExpandView类呢?分为两步:

(1)在UI配置文件里引用定义 该View:

<LinearLayout

android:id="@+id/layout_title"
android:layout_width="fill_parent"
android:layout_height="50dp"
android:background="#63A90A"
android:orientation="horizontal"
android:gravity="center">
<TextView
android:id="@+id/textview_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="#FFFFFF"
android:textSize="22sp"
android:text="点击向下展开"
/>
<ImageView
android:id="@+id/imageview_state"
android:layout_width="15dp"
android:layout_height="15dp"
android:layout_marginLeft="2dp"
android:src="@drawable/expand"
/>
</LinearLayout>

(1)在java类中引用ExpandView类:

private ExpandView mExpandView;    private LinearLayout mLinearLayout;    private TextView mTextView;    private ImageView mImageView;public void initExpandView(){       mLinearLayout = (LinearLayout)findViewById(R.id.layout_title);        mTextView = (TextView)findViewById(R.id.textview_title);        mImageView = (ImageView)findViewById(R.id.imageview_state);        mExpandView = (ExpandView) findViewById(R.id.expandView);        mExpandView.setContentView();        mLinearLayout.setClickable(true);        mLinearLayout.setOnClickListener(new OnClickListener() {                    @Override            public void onClick(View v) {                // TODO Auto-generated method stub                if(mExpandView.isExpand()){                    mExpandView.collapse();                    mTextView.setText("点击向下展开");                    mImageView.setImageDrawable(getResources().getDrawable(R.drawable.expand));                }else{                    mExpandView.expand();                    mTextView.setText("点击向上收叠");                    mImageView.setImageDrawable(getResources().getDrawable(R.drawable.collapse));                }            }        });  }

 

转载于:https://www.cnblogs.com/JczmDeveloper/p/3782586.html

你可能感兴趣的文章
用JS制作博客页面背景随滚动渐变的效果
查看>>
JavaScript的迭代函数与迭代函数的实现
查看>>
一步步教你学会browserify
查看>>
Jmeter入门实例
查看>>
亲近用户—回归本质
查看>>
中文脏话识别的解决方案
查看>>
CSS之不常用但重要的样式总结
查看>>
Python编译错误总结
查看>>
URL编码与解码
查看>>
日常开发时遇到的一些坑(三)
查看>>
Eclipse 安装SVN插件
查看>>
深度学习
查看>>
TCP粘包问题及解决方案
查看>>
构建之法阅读笔记02
查看>>
添加按钮
查看>>
移动端页面开发适配 rem布局原理
查看>>
Ajax中文乱码问题解决方法(服务器端用servlet)
查看>>
会计电算化常考题目一
查看>>
阿里云服务器CentOS6.9安装Mysql
查看>>
剑指offer系列6:数值的整数次方
查看>>