自定义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;
        }
    }
}


猜你喜欢

转载自blog.csdn.net/lxd13699/article/details/80517361