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

来源:互联网 发布:java api文档下载 编辑:程序博客网 时间:2024/03/29 03:27



自定义一个包含了各种控件的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:位或运算。


0 0
原创粉丝点击