自定义View实现梯形布局(点击添加按钮添加视图)
长按删除条目,点击进行跳转传值
1.写一个类继承ViewGroup
package com.example.moniti; import android.animation.ObjectAnimator; import android.content.Context; import android.util.AttributeSet; import android.view.View; import android.view.ViewGroup; /** * Created by 11561 on 2018/5/30. */ public class MyGroupViews extends ViewGroup{ private int measuredWidth; public MyGroupViews(Context context) { super(context); } public MyGroupViews(Context context, AttributeSet attrs) { super(context, attrs); } public MyGroupViews(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); //得到值模拟器的宽度 measuredWidth = getMeasuredWidth(); //测量子View的宽高,只有ViewFroup中有这个方法,直接继承自View是没有这个方法的 measureChildren(widthMeasureSpec,heightMeasureSpec); } @Override protected void onLayout(boolean changed, int l, int t, int r, int b) { //拿到子控件的个数 int childCount = getChildCount(); //定义一个临时高度 int startHeight=0; int startWidth=0; for (int i = 0; i <childCount ; i++) { View v = getChildAt(i); //给每一个view设置自己的位置 上 右 下 左 v.layout(startWidth, startHeight, startWidth + v.getMeasuredWidth(), startHeight + v.getMeasuredHeight()); startHeight += v.getMeasuredHeight(); startWidth += v.getMeasuredWidth(); //判断如果超出模拟器宽度,重新赋值 if(startWidth>=measuredWidth){ startWidth=0; } } } }
2.布局
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context="com.example.moniti.MainActivity"> <RelativeLayout android:layout_width="match_parent" android:layout_height="wrap_content"> <TextView android:text="三色梯" android:textSize="20dp" android:layout_centerHorizontal="true" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <Button android:id="@+id/tianjia" android:text="添加" android:layout_alignParentRight="true" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </RelativeLayout> <com.example.moniti.MyGroupViews android:id="@+id/mygroups" android:layout_width="wrap_content" android:layout_height="wrap_content"> </com.example.moniti.MyGroupViews> </LinearLayout>
3Mainactivity中调用
每台阶梯子占控件宽度的1/3,垂直方向依次向下添加
package com.example.moniti; import android.animation.ObjectAnimator; import android.content.Intent; import android.graphics.Color; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.util.DisplayMetrics; import android.view.View; import android.widget.Button; import android.widget.TextView; import android.widget.Toast; import java.util.ArrayList; import java.util.List; public class MainActivity extends AppCompatActivity implements View.OnClickListener { private Button tianjia; private MyGroupViews mygroups; private int i=0; private MyGroupViews myGroupViews; private int widthPixels; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initView(); } private void initView() { tianjia = (Button) findViewById(R.id.tianjia); mygroups = (MyGroupViews) findViewById(R.id.mygroups); //myGroupViews = new MyGroupViews(this); tianjia.setOnClickListener(this); //每台阶梯子占控件宽度的1/3,垂直方向依次向下添加 DisplayMetrics displayMetrics=new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(displayMetrics); widthPixels = displayMetrics.widthPixels; } @Override public void onClick(View v) { switch (v.getId()) { case R.id.tianjia: tianjia.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { i++; //创建text view final TextView textView = new TextView(MainActivity.this); //设置宽高 textView.setHeight(50); textView.setWidth(250); //添加i i是定义好的int值 textView.setText(i+""); //使用setTag这个是为了如果传值可以得到每个text view的i textView.setTag(i); //设置颜色 if(i%3==1){ textView.setBackgroundColor(Color.RED); }else if(i%3==2){ textView.setBackgroundColor(Color.YELLOW); }else{ textView.setBackgroundColor(Color.GREEN); } //自定义添加视图 mygroups.addView(textView); //添加条目时的动画 ObjectAnimator animator=ObjectAnimator.ofFloat(textView,"translationX",-800f,0f,0f); animator.setDuration(2000); animator.start(); //长按删除 textView.setOnLongClickListener(new View.OnLongClickListener() { @Override public boolean onLongClick(View v) { mygroups.removeView(textView); return true; } }); //点击跳转传值 textView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent=new Intent(MainActivity.this,Main2Activity.class); intent.putExtra("shu",textView.getTag()+""); startActivity(intent); } }); } }); break; } } }