自定义ViewGroup——圆形排列LinearLayout

自定义ViewGroup——圆形排列LinearLayout


官方的控件远远无法满足客户的需求了,很多时候需要自己去定义需要的View和ViewGroup。前段时间因为公司的项目非常赶,自己写好的东西都没有时间记录下来,现在稍微好点,就在博客这里留下点足迹。之前一直对onMeasure(),onLayout(),onDraw()这几个方法似懂非懂的,如今顺便复习一下。


如题,我们需要实现一个将ViewGroup内的ChildView进行环形平均排列,效果如下:

自定义ViewGroup——圆形排列LinearLayout_第1张图片


自定义ViewGroup步骤:

1、attr.xml自定义属性

2、自定义ViewGroup,并在构造方法中取得属性

3、复写测量控件大小方法onMeasure(),复写测量摆放ChildView方法onLayout()

4、在布局中使用自定义ViewGroup,并使用自己的自定义属性(

在根布局中声命名空间 xmlns:kubyattr="http://schemas.android.com/apk/res/com.happy.myfragmentapplication"

并使用happyattr:circleRadius="70dp"


下面上代码:

1、attr.xml自定义属性

  
        
    


2、自定义ViewGroup,并在构造方法中取得属性

3、复写测量控件大小方法onMeasure(),复写测量摆放ChildView方法onLayout()
package com.happy.myfragmentapplication.customview;

import android.content.Context;
import android.content.res.TypedArray;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;

import com.happy.myfragmentapplication.R;
import com.happy.myfragmentapplication.Utils.MyMath;

import java.util.List;

/**
 * Created by Kuby on 2016/5/20.
 */
public class CircleLinearLayout extends ViewGroup{

    private final String TAG = "CircleLinearLayout";

    private int radius;

    public CircleLinearLayout(Context context) {
        super(context);
    }

    public CircleLinearLayout(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public CircleLinearLayout(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        TypedArray typedArray = getContext().getTheme().obtainStyledAttributes(attrs, R.styleable.CircleLinearLayout,defStyleAttr,0);
        int count = typedArray.getIndexCount();
        for (int i = 0; i

package com.happy.myfragmentapplication.Utils;

import android.util.Log;

/**
 * Created by Kuby on 2016/5/20.
 */
public class MyMath {

    private final static String TAG = "MyMath";

    /**
     * 以原点为圆点,以radius维半径画圆,通过弧度o,获得坐标
     * @param radius 半径
     * @param o 弧度
     * @return
     */
    public static float[] getXYPoint(float[] centrePoint, int radius, float o){
        Log.d(TAG,"o: "+o);
        Log.d(TAG,"radius: "+radius);
        Log.d(TAG,"centrePoint: ["+centrePoint[0]+","+centrePoint[1]+"]");
        float[] xyPoint = {(float) (radius*Math.sin(o) + centrePoint[0]), (float) ((-1)*radius*Math.cos(o) + centrePoint[1])};
//        Log.d(TAG,"test: ["+xyPoint[0]+","+xyPoint[1]+"]");
        return xyPoint;
    }
}

4、在布局中使用自定义ViewGroup,并使用自己的自定义属性



    
    
    
       
        

            

            

            

            

            

            

            

            

        
    





你可能感兴趣的:(Android开发,自定义View)