自定义view (一)自定义控件 viewGroup



自定义一个包含了各种控件的viewGroup, 这里主要是用来给 app “我的” 模块下的多条类似的item, 有一点,自定义的view不能放到作为lib的moudel里面,不然就会像使用pulltorefresh一样,你使用自定义的控件的时候,自己的属性系统不会提示不说,其他的控件的属性也不会提示,很蛋疼



- 1、自定义View的属性
- 2、在View的构造方法中获得我们自定义的属性
- 3、重写onMesure 
- 4、重写onDraw


1.新建布局文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center_vertical">
    <ImageView
        android:id="@+id/img_left"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="15dp"
        />

    <TextView
        android:id="@+id/tv_left"
        style="@style/tv_home_16sp_33"
        android:layout_width="0dp"
        android:layout_weight="1"
        android:layout_height="wrap_content"
        android:layout_marginLeft="15dp"
        android:text=""/>

    <TextView
        android:id="@+id/tv_right"
        style="@style/tv_home_16sp_33"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginRight="15dp"
        android:text=""/>

    <ImageView
        android:id="@+id/img_right"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginRight="15dp"/>


</LinearLayout>
2.新建类

package com.xunku.basetest.customView;

import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Color;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;

import com.xunku.basetest.R;


/**
 * Created 郑贤鑫 on 2017/2/10.
 *
 * 主要用于 app  我的 模块  里面有多个item
 * 可能还有很多不够周到的地方,以后再修改
 */

public class MeItem extends LinearLayout {

    ImageView img_left;
    TextView tv_left;
    TextView tv_right;
    ImageView img_right;

    public MeItem(Context context, AttributeSet attrs) {
        super(context, attrs);
        LayoutInflater.from(context).inflate(R.layout.custom_me_item,this,true);

        img_left= (ImageView) findViewById(R.id.img_left);
        tv_left= (TextView) findViewById(R.id.tv_left);
        tv_right= (TextView) findViewById(R.id.tv_right);
        img_right= (ImageView) findViewById(R.id.img_right);

//        TypedArray attributes = context.obtainStyledAttributes(attrs,R.styleable.mItem);
        TypedArray attributes = context.obtainStyledAttributes(attrs,R.styleable.MeItem);

        if(attributes != null){

            //图片资源
            int leftImgRes;
            int rightImgRes;

            //文字资源
            String leftText;
            String rightText;

            //大小
            int leftImgSize;
            int leftTextSize;
            int rightImgSize;
            int rightTextSize;

            //颜色
            int leftTextColor;
            int rightTextColor;

            leftImgRes=attributes.getResourceId(R.styleable.MeItem_leftImg,-1);
            rightImgRes=attributes.getResourceId(R.styleable.MeItem_rightImg,-1);

            leftText=attributes.getString(R.styleable.MeItem_leftText);
            rightText=attributes.getString(R.styleable.MeItem_rightText);

            leftImgSize = attributes.getDimensionPixelSize(R.styleable.MeItem_leftImgSize,40);
            leftTextSize = attributes.getDimensionPixelSize(R.styleable.MeItem_leftTextSize,16);
            rightImgSize = attributes.getDimensionPixelSize(R.styleable.MeItem_rightImgSize,40);
            rightTextSize = attributes.getDimensionPixelSize(R.styleable.MeItem_rightTextSize,16);

            leftTextColor=attributes.getColor(R.styleable.MeItem_leftTextColor, Color.BLACK);
            rightTextColor=attributes.getColor(R.styleable.MeItem_rightTextColor, Color.BLACK);



//            img_left.setImageResource(rightImgRes);
//            tv_left.setText(leftText);
//            tv_right.setText(rightText);

            //左边图片
            setImg(img_left,leftImgRes,leftImgSize);
            //右边图片
            setImg(img_right,rightImgRes,rightImgSize);

            //左边文字
            setTextView(tv_left,leftText,leftTextSize,leftTextColor);
            //右边文字
            setTextView(tv_right,rightText,rightTextSize,rightTextColor);





        }
        attributes.recycle();
    }

    /**
     * 图片设置
     * @param img
     * @param res
     * @param size
     */
    private void setImg(ImageView img,int res,int size){
//        Log.i(img.getClass().getSimpleName(), "setImg: "+size);


        ViewGroup.LayoutParams lp=img.getLayoutParams();

        if(-1 == res){
            lp.height=0;
            lp.width=0;
            img.setVisibility(GONE);
        }else {
            lp.height=size;
            lp.width=size;
            img.setImageResource(res);
            img.setVisibility(VISIBLE);
        }

        img.setLayoutParams(lp);
    }

    /**
     * 文字的设置
     * @param tv
     * @param text
     * @param size
     * @param color
     */
    private void setTextView(TextView tv,String text,int size,int color){
//        Log.i(tv.getClass().getSimpleName(), "setTextView: "+text+"  "+size+"   "+color);
        tv.setText(text);
        tv.setTextSize(size);
        tv.setTextColor(color);
    }


    /**
     * 用于修改 右侧文字,
     * @param text
     */
    public void setRightText(String text){
        tv_right.setText(text);
    }
}
3.在你的style文件中添加给控件使用的各种属性,这里有一点需要注意,这里的 declare-styleable的 name值要跟你的自定义view的类名一模一样 ,不然当你在自己的布局文件中使用这个自定义控件的时候,系统不会提示自定义控件的各种属性,非常蛋疼,补充:后来才发现,这些属性最好放在res/values/attr.xml中,最好不要放在style文件里

<declare-styleable name="MeItem">
        <attr name="leftImg" format="reference|integer"/>
        <attr name="leftText" format="reference|string"/>
        <attr name="rightText" format="reference|string"/>
        <attr name="rightImg" format="reference|integer"/>

        <attr name="leftImgSize" format="reference|dimension"/>
        <attr name="leftTextSize" format="reference|dimension"/>
        <attr name="rightImgSize" format="reference|dimension"/>
        <attr name="rightTextSize" format="reference|dimension"/>

        <attr name="leftTextColor" format="reference|color"/>
        <attr name="rightTextColor" format="reference|color"/>
    </declare-styleable>
4.使用:直接在布局文件中引用

<com.xunku.basetest.customView.MeItem
        android:id="@+id/meItem"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        app:leftText="124"
        app:rightText="13元"
        app:rightImg="@mipmap/ic_launcher"
        />

注:各种format的值

reference:参考某一资源ID。
color:颜色值。
boolean:布尔值。
dimension:尺寸值。
float:浮点值。
integer:整型值。
string:字符串。
fraction:百分数。
enum:枚举值。
flag:位或运算。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值