001-自定义视图-圆角TextView、ImageView、Button

时间:2021-03-08 20:35:20

今天总结了一下如何自定义圆角视图的方法,使用了一种比较简单的方式,直接在控件属性里面添加.9格式圆角的png图片背景,然后即可达到预期的效果,同时还挺方便,在项目中使用到这里方式来设置效果,还是很常见的。那我就不见解了,现在讲如何自定义ImageViewLinearLayout,实现在ImageView中可以显示文字,同时在LinearLayout中显示图文并茂的效果,如下图:

 001-自定义视图-圆角TextView、ImageView、Button

一、前面二个直接添加.9格式图片作为TextViewButton控件的背景,展示出圆角效果

二、后面三个自定义ImageViewLinearLayout,即继承ImageViewLinearLayout,然后重写构造方法和其中的onDraw方法。

三、自定义视图三部曲:第一声明属性、第二继承需要的自定义视图的父类,例如ImageViewLinearLayout或者View、第三在布局文件中引用

      第一步:创建attrs.xml,并定义需要使用到的属性,我习惯的自定义方式,如下图:

           

 001-自定义视图-圆角TextView、ImageView、Button

<resources>

    <declare-styleable name="MyImageView">

        <attr name="android:text" />

        <attr name="android:textColor" />

        <attr name="android:textSize" />

        <attr name="android:background"/>

    </declare-styleable>

</resources>

   说明:这里,我直接定义属性名字系统的一样,在布局文件中引用的时候,比较方便,你也可以定义成<attrs name=myText format=string/>表示属性名为:myText,格式是字符串类型,或者定义成颜色类型:<attrs name=myColor format=color/>,其中format的取值主要有:

1. reference:参考某一资源ID

2. color:颜色值。

3. boolean:布尔值。

4. dimension:尺寸值。

5. float:浮点值。

6. integer:整型值。

7. string:字符串。

8. fraction:百分数。

9. enum:枚举值。

10. flag:位或运算。

这里我只列出取值的类型,具体怎么使用请前往飞腾空间查看我另一篇帖子。

     第二步:继承ImageView,重写onDraw方法

package cn.teachcourse.utils.view;

 

import android.content.Context;

import android.content.res.TypedArray;

import android.graphics.Canvas;

import android.graphics.Paint;

import android.graphics.Paint.FontMetricsInt;

import android.util.AttributeSet;

import android.widget.ImageView;

import cn.teachcourse.round.R;

 

/**

 * 重写onDraw方法,绘制独特的ImageView

 * 

 * @author 飞腾:http://teachcourse.cn

 * @version 创建:2015-9-30上午9:35:05

 */

public class MyRoundImageView extends ImageView {

private int textColor;

private float textSize;

private String textContent;

private Paint mPaint;

private FontMetricsInt mFontMetricsInt;

 

private int mWidth;

private int mHeight;

private float mStringWidth;

 

public MyRoundImageView(Context context) {

super(context);

// TODO Auto-generated constructor stub

}

 

public MyRoundImageView(Context context, AttributeSet attrs) {

super(context, attrs);

// TODO Auto-generated constructor stub

TypedArray ta = context.obtainStyledAttributes(attrs,

R.styleable.MyImageView);

textColor = ta.getColor(R.styleable.MyImageView_android_textColor, 0);

textSize = ta.getDimension(R.styleable.MyImageView_android_textSize,

12f);

textContent = ta.getString(R.styleable.MyImageView_android_text);

initPaint();

ta.recycle();

}

public MyRoundImageView(Context context, AttributeSet attrs,

int defStyleAttr) {

super(context, attrs, defStyleAttr);

}

 

 

@Override

protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

// TODO Auto-generated method stub

super.onMeasure(widthMeasureSpec, heightMeasureSpec);

}

 

@Override

protected void onDraw(Canvas canvas) {

// TODO Auto-generated method stub

super.onDraw(canvas);

int x, y;

if (mPaint.getTextAlign() == Paint.Align.LEFT) { // 

x = mWidth / 2 - (int) (mStringWidth / 2);

} else if (mPaint.getTextAlign() == Paint.Align.CENTER) { // 

x = mWidth / 2;

} else { // 

x = mWidth / 2 + (int) (mStringWidth / 2);

}

y = (mHeight - mFontMetricsInt.ascent - mFontMetricsInt.descent) / 2;

 

canvas.drawText(textContent, x, y, mPaint);

 

}

 

@Override

protected void onSizeChanged(int w, int h, int oldw, int oldh) {

super.onSizeChanged(w, h, oldw, oldh);

mWidth = w;

mHeight = h;

}

 

private float measureText() {

mStringWidth = mPaint.measureText(textContent);

return mStringWidth;

}

 

private void initPaint() {

mPaint = new Paint();

mPaint.setStrokeWidth(1);

mPaint.setTextSize(textSize);

mPaint.setTextAlign(Paint.Align.CENTER);

mPaint.setStyle(Paint.Style.FILL);

mPaint.setColor(textColor);

mFontMetricsInt = mPaint.getFontMetricsInt();

measureText();

}

}

 

第三步:布局文件中引用

 

查看效果:

 001-自定义视图-圆角TextView、ImageView、Button

现在算是完成了自定义ImageView显示文字、圆角效果,关键是重写onDraw方法,在里面绘制显示的文字,因为ImageView本身没提供显示文字的属性,如果对PaintCanvas熟悉的,自然很容易理解,不是问题。接下来我们看看,这种重写的LinearLayout如何实现:

 

第一步:声明需要使用到的属性

    <declare-styleable name="MyImageButtton">

        <attr name="android:src" />

        <attr name="android:background" />

        <attr name="android:text" />

        <attr name="android:textColor"/>

</declare-styleable>

第二步:继承LinearLayout父类

package cn.teachcourse.utils.view;

 

import cn.teachcourse.round.R;

import android.annotation.SuppressLint;

import android.content.Context;

import android.content.res.TypedArray;

import android.graphics.drawable.Drawable;

import android.util.AttributeSet;

import android.view.LayoutInflater;

import android.view.View;

import android.widget.ImageView;

import android.widget.LinearLayout;

import android.widget.RelativeLayout;

import android.widget.TextView;

 

/**

 * 

 * @author 飞腾:http://teachcourse.cn

 * @version 创建:2015-9-29下午2:50:25

 */

@SuppressLint("NewApi")

public class MyRoundButtonView extends LinearLayout {

private RelativeLayout round_bg_ll;

private ImageView round_iv;

private TextView round_tv;

 

public MyRoundButtonView(Context context, AttributeSet attrs) {

super(context, attrs);

// TODO Auto-generated constructor stub

View view = LayoutInflater.from(context).inflate(

R.layout.my_round_btn_view, this, true);

 

round_bg_ll = (RelativeLayout) view.findViewById(R.id.my_round_rl);

round_iv = (ImageView) view.findViewById(R.id.my_icon_iv);

round_tv = (TextView) view.findViewById(R.id.my_info_tv);

 

TypedArray ta = context.obtainStyledAttributes(attrs,

R.styleable.MyImageButtton);

CharSequence text = ta.getText(R.styleable.MyImageButtton_android_text);

Drawable background = ta

.getDrawable(R.styleable.MyImageButtton_android_background);

Drawable src = ta.getDrawable(R.styleable.MyImageButtton_android_src);

int color=ta.getColor(R.styleable.MyImageButtton_android_textColor, 0);

 

if (text != null)

round_tv.setText(text);

 

if (background != null)

// round_bg_ll.setBackground(background);

round_bg_ll.setBackgroundResource(ta.getResourceId(

R.styleable.MyImageButtton_android_background, 0));

 

if (src != null)

round_iv.setImageDrawable(src);

        if(color!=0)

        round_tv.setTextColor(color);

}

 

public MyRoundButtonView(Context context, AttributeSet attrs,

int defStyleAttr, int defStyleRes) {

super(context, attrs, defStyleAttr, defStyleRes);

// TODO Auto-generated constructor stub

}

 

public MyRoundButtonView(Context context) {

super(context);

// TODO Auto-generated constructor stub

}

 

}

第三步:布局文件中引用

 <cn.teachcourse.utils.view.MyRoundButtonView

        android:id="@+id/round_btn_view_001"

        android:layout_width="match_parent"

        android:layout_height="wrap_content"

        android:layout_alignParentLeft="true"

        android:layout_below="@+id/round_view_iv"

        android:layout_marginTop="30dp"

        android:background="@drawable/green_bg"

        android:src="@drawable/ic_launcher"

        android:text="自定义属性"

        android:textColor="#FFFFFF" />

效果显示:

 001-自定义视图-圆角TextView、ImageView、Button

 

说明:这里解释一下这里,直接加载一个自定义的my_round_btn_view.xml文件,然后取得其View对象对应的控件

LayoutInflater.from(context).inflate(

R.layout.my_round_btn_view, this, true);

 

my_round_btn_view.xml文件内容

<?xml version="1.0" encoding="utf-8"?>

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"

    android:layout_width="fill_parent"

    android:layout_height="wrap_content"

    android:id="@+id/my_round_rl"

    android:layout_gravity="center_vertical" >

 

    <ImageView

        android:id="@+id/my_icon_iv"

        android:layout_width="wrap_content"

        android:layout_height="wrap_content"

        android:src="@drawable/ic_launcher" 

        android:layout_toLeftOf="@+id/my_info_tv"

        android:layout_centerInParent="true"/>

 

    <TextView

        android:id="@+id/my_info_tv"

        android:layout_width="wrap_content"

        android:layout_height="wrap_content"

        android:text="显示文字"

        android:layout_centerInParent="true"/>

 

</RelativeLayout>

 

 

 

 点击资源下载