我是靠谱客的博主 忐忑龙猫,最近开发中收集的这篇文章主要介绍Android自定义控件的自定义属性2种实现方式,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

本文讲通过一个自定义按钮来讲解自定义控件中的自定义属性的2种实现方式。
首先,本AutoButton实现功能是按钮的文字可以根据自定义的行数对文字进行自动缩放,例如maxLines = 2,那么本按钮无论多少文字,最多只显示2行,当超出2行则字体会进行自动缩放,然后再重新mesure。
1、方式一,直接在引用的自定义控件中设置自定义属性。
贴上代码如下:

package com.example.kingsoft.CustomWidget;

import android.annotation.SuppressLint;
import android.content.Context;
import android.content.res.TypedArray;
import android.os.Debug;
import android.util.AttributeSet;
import android.util.TypedValue;
import android.widget.Button;

import com.example.kingsoft.CustomAdapter.R;

/**
 * 自定义属性MaxLine:
 * <AutoAdjustButton
 *      MaxLine="1"
 *      android:layout_width = "wrap_content"
 *      android:layout_height = "wrap_content"/>
 *
 */
@SuppressLint("AppCompatCustomView")
public class AutoAdjustButton extends Button {

    private final float FONT_ACCURACY_SIZE = 2f;
    private float mDefaultTextSize;

    private int mMaxLine = 2;

    public AutoAdjustButton(Context context) {
        this(context, null);
    }

    public AutoAdjustButton(Context context, AttributeSet attrs) {
        this(context, attrs, android.R.attr.buttonStyle);
    }

    public AutoAdjustButton(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        if (attrs != null) {
//            Debug.waitForDebugger();
//          TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.AutoAdjustButton);
//          mMaxLine  = typedArray.getInt(R.styleable.AutoAdjustButton_maxLineNum, 10);
//          mDefaultTextSize = getTextSize();
            mMaxLine =  attrs.getAttributeIntValue(null, "MaxLine", mMaxLine);
        }
    }

//  public void setMaxLine(int line) {
//      mMaxLine = line;
//  }

    @Override
    public void setTextSize(int unit, float size)
    {
        super.setTextSize(unit, size);
        mDefaultTextSize = getTextSize();
    }

    public void setTempTextSize(int unit, float size) {
        super.setTextSize(unit, size);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
//      Debug.waitForDebugger();
        if (mDefaultTextSize > 0)
            super.setTextSize(TypedValue.COMPLEX_UNIT_PX, mDefaultTextSize);
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);

        if (mMaxLine <= 0 || getLineCount() <= mMaxLine || getMeasuredWidth() <= 0) {
            return;
        }

        //高度大于两行
        float maxFontSize = getTextSize();
        float minFontSize = 0;
        float oriFontSize = maxFontSize;
        float curFontSize = 0;

        while (maxFontSize - minFontSize > FONT_ACCURACY_SIZE) {
            curFontSize = (maxFontSize + minFontSize) / 2;

            super.setTextSize(TypedValue.COMPLEX_UNIT_PX, curFontSize );
            super.onMeasure(widthMeasureSpec, heightMeasureSpec);

            if (getLineCount() > mMaxLine) {
                maxFontSize = curFontSize;
            } else {
                minFontSize = curFontSize;
//              break;
            }
        }

        if (minFontSize < FONT_ACCURACY_SIZE / 2) {
            minFontSize = oriFontSize;
        }

        super.setTextSize(TypedValue.COMPLEX_UNIT_PX, minFontSize );
        if (Math.abs(curFontSize - minFontSize) < 0.0000001f)
        {
            super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        }
    }

}

以下贴上前段代码:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:ad="http://schemas.android.com/apk/res-auto"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center">
    <com.example.kingsoft.CustomWidget.AutoAdjustButton
        android:text="特殊所所所所所所所胜多负少的范德萨发大水"
        android:layout_height="100dp"
        android:layout_width="200dp"
        MaxLine="1"/>
</LinearLayout>

请注意xml文件中的MaxLine=”1”,这里我直接在使用的地方定义了自定义属性,然后在AutoButton.java中构造函数中 通过 attrs.getAttributeIntValue(null, “MaxLine”, mMaxLine); 获取到了自定义属性。

运行以上代码,请看如下截图:

这里写图片描述

通过上图可以看出 自定义的MaxLine = “1” 已经成功获取。

2、通过attr.xml中的declare-styleable来设置自定义属性。

修改后的代码如下:

attr.xml 文件,声明了自定义属性集合AutoAdjustButton(和自定义控件名称保持一致),自定义属性有

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <declare-styleable name="AutoAdjustButton">
        <attr name="maxLineNum" format="integer" />
    </declare-styleable>
</resources>
引用控件的XML中 , MaxLine="1" 用  ad:maxLineNum="1"进行替换,ad自己随便设置,最好代表一定的意义

 <com.example.kingsoft.CustomWidget.AutoAdjustButton
        android:text="特殊所所所所所所所胜多负少的范德萨发大水"
        android:layout_height="100dp"
        android:layout_width="200dp"
        ad:maxLineNum="1" />

修改AutoAdjustButton中获取 maxLine的代码,将mMaxLine = attrs.getAttributeIntValue(null, “MaxLine”, mMaxLine); 替换为以下代码:

            TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.AutoAdjustButton);
            int fontSize = typedArray.getInt(R.styleable.AutoAdjustButton_maxLineNum, 10);
            mDefaultTextSize = getTextSize();

实现完毕,运行结果和第一种的自定义属性一致!

最后

以上就是忐忑龙猫为你收集整理的Android自定义控件的自定义属性2种实现方式的全部内容,希望文章能够帮你解决Android自定义控件的自定义属性2种实现方式所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(51)

评论列表共有 0 条评论

立即
投稿
返回
顶部