android中的一个属性动画,可以显示更多的一个案例
16lz
2021-01-23
下面是代码:
MainActivity
public class MainActivity extends AppCompatActivity { ListView lv; //自定义属性 List mList = new ArrayList<>(); ShowTextView showTextView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); for (int i = 0; i < 10; i++) { mList.add("菜单" + i); } setContentView(R.layout.activity_main); lv = (ListView) findViewById(R.id.lv); lv.setAdapter(adapter); showTextView = (ShowTextView) findViewById(R.id.showTextView); showTextView.setText("加载动画\n" + "AnimationUtils\n" + "\n" + "所有动画都有的属性\n" + "fillAfter 动画播放完毕后 停留在最后的动画的状态,不能同时播放帧动画后停止状态\n" + "android:repeatCount=\"infinite\" 次数,可选数值\n" + "android:repeatMode=\"reverse\" 反转 模式 默认重复,\n" + "android:interpolator=\"@android:anim/bounce_interpolator\" 弹球效果,不能在set里面\n" + "\n" + "java代码创建\n" + " Animation anim = new ScaleAnimation(0, 1, 0, 1, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);\n" + " \n" + "如果没有写TO_SELF,那么针对父窗体\n" + "\n" + "增对activity的进出场动画\n" + "overridePendingTransition\n" + "必须放在finish或者startactivity还有forResult之后的一句,"); } private BaseAdapter adapter = new BaseAdapter() { @Override public int getCount() { return mList.size(); } @Override public Object getItem(int position) { return null; } @Override public long getItemId(int position) { return 0; } @Override public View getView(int position, View convertView, ViewGroup parent) { //每条都给动画 if (convertView == null) convertView = View.inflate(MainActivity.this, android.R.layout.simple_list_item_1, null); TextView tv = (TextView) convertView; tv.setText(mList.get(position)); //动画 tv.startAnimation(getTranAnim(position)); return convertView; } public Animation getTranAnim(int position) { Animation anim = new TranslateAnimation(getResources().getDisplayMetrics().widthPixels, 0, 0, 0); anim.setDuration(300); anim.setStartOffset(100 * position); return anim; } };}
ShowTextView ,显示动画效果的类
public class ShowTextView extends LinearLayout implements View.OnClickListener { TextView tvContent, tvMore; boolean isShow; public ShowTextView(Context context) { super(context); init(); } //设置文本 public void setText(String text) { tvContent.setText(text); initText(); } /** * private void init() { //有两个组件 setOrientation(VERTICAL); //marge标签 View.inflate(getContext(), R.layout.textview_layout, this); //this.addView(layout); tvContent = (TextView) findViewById(R.id.tv_content); tvContent.setPadding(10, 10, 10, 10); tvMore = (TextView) findViewById(R.id.tv_more); //开始设置 initText(); } private void initText() { //延迟的去操作view tvContent.post(new Runnable() { @Override public void run() { //判断是否单行 Log.e("TAG", "------------" + tvContent.getLineCount()); if (tvContent.getLineCount() != 1) { tvContent.setGravity(Gravity.LEFT); } else { tvContent.setGravity(Gravity.CENTER); } //判断是否超过5行 if (tvContent.getLineCount() > 5) { tvMore.setVisibility(View.VISIBLE); tvMore.setOnClickListener(ShowTextView.this); } else { tvMore.setVisibility(View.GONE); } } }); } public ShowTextView(Context context, AttributeSet attrs) { super(context, attrs); init(); } @SuppressLint("NewApi") @Override public void onClick(View v) { //当用户点击的时候 isShow = !isShow; if (isShow) { //需要显示更多 tvMore.setText("收起"); //属性动画 //。。。代表可变长度数值 Log.e("TAG", tvContent.getMaxLines() + " " + tvContent.getLineCount()); ObjectAnimator.ofInt(tvContent, "lines", 5, tvContent.getLineCount()).setDuration(500).start(); } else { //收起 tvMore.setText("显示更多"); ObjectAnimator.ofInt(tvContent, "lines", tvContent.getLineCount(), 5).setDuration(500).start(); } }}
show_layout.xml用的是merge标签
<?xml version="1.0" encoding="utf-8"?><merge xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="wrap_content"> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:maxLines="5" android:id="@+id/tv_content" android:gravity="center" android:text="显示内容"/> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_margin="10dp" android:id="@+id/tv_more" android:visibility="invisible" android:text="显示更多"/>merge>
activity_main.xml
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:orientation="vertical" android:id="@+id/activity_main" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.example.listanim_10_28.MainActivity"><com.example.listanim_10_28.ShowTextView android:layout_width="match_parent" android:id="@+id/tv_show" android:layout_height="wrap_content" /> <ListView android:id="@+id/lv" android:layout_width="wrap_content" android:visibility="invisible" android:layout_height="wrap_content" />LinearLayout>
更多相关文章
- RelativeLayoutd 的属性
- android 多张图片动画方式轮播(转载)
- Android 属性动画中心点无限循环
- Android 二级动画弹出菜单
- android页面切换动画
- 『ANDROID』反射取子类、父类 属性
- API 25 (Android 7.1.1 API) widget.ImageView——属性分析
- Android在View中的动画
- android 彩带动画,粒子动画