zoukankan      html  css  js  c++  java
  • android开发之自定义组件

    自定义Android组件可以帮助我们实现一些特殊需求,而且使得我们的应用变得更加灵活,今天我给大家介绍的是如何自定义一个组件,实现特殊的效果.

    wps_clip_image-72

    package jack.label;
    
    import android.app.Activity;
    
    import android.os.Bundle;
    
    public class RoundRectLabel extends Activity {
    
        @Override
    
        public void onCreate(Bundle savedInstanceState) {
    
            super.onCreate(savedInstanceState);
    
            setContentView(R.layout.round_rect_label);
    
        }
    
    }
     
    package jack.label;
    
    import java.util.ArrayList;
    
    import java.util.List;
    
    import android.content.Context;
    
    import android.content.res.TypedArray;
    
    import android.graphics.Canvas;
    
    import android.graphics.Color;
    
    import android.graphics.Paint;
    
    import android.graphics.Path;
    
    import android.graphics.RectF;
    
    import android.graphics.Path.Direction;
    
    import android.util.AttributeSet;
    
    import android.view.View;
    
    public class RoundRectLabelView extends View
    
    {
    
    private Paint mTextPaint;
    
    private String mText;
    
    private int mAscent = 0;
    
    private List<String> textList = new ArrayList<String>();
    
    private int mTextHeight;
    
    private int width = 0;
    
    private int height = 0;
    
    final int border_width = 5;
    
    private String mTitle;
    
    public RoundRectLabelView(Context context)
    
    {
    
    super(context);
    
    initLabelView();
    
    }
    
    public RoundRectLabelView(Context context, AttributeSet attrs)
    
    {
    
    super(context, attrs);
    
    initLabelView();
    
    TypedArray Attributes = context.obtainStyledAttributes(attrs,
    
    R.styleable.LabelView);
    
    CharSequence s = Attributes.getString(R.styleable.LabelView_text);
    
    if (s != null)
    
    {
    
    setText(s.toString());
    
    }
    
    CharSequence title=Attributes.getString(R.styleable.LabelView_titleText);
    
    if (title!=null)
    
    {
    
        setTitle(title.toString());
    
    }
    
    setTextColor(Attributes.getColor(R.styleable.LabelView_textColor,
    
    0xFF000000));
    
    int textSize = Attributes.getDimensionPixelOffset(
    
    R.styleable.LabelView_textSize, 0);
    
    if (textSize > 0)
    
    {
    
    setTextSize(textSize);
    
    }
    
    Attributes.recycle();
    
    }
    
    public void setText(String text)
    
    {
    
    mText = text;
    
    requestLayout();
    
    invalidate();
    
    }
    
    public void setTextSize(int size)
    
    {
    
    mTextPaint.setTextSize(size);
    
    requestLayout();
    
    invalidate();
    
    }
    
    private final void initLabelView()
    
    {
    
    mTextPaint = new Paint();
    
    mTextPaint.setAntiAlias(true);
    
    mTextPaint.setTextSize(16);
    
    mTextPaint.setColor(0xFF000000);
    
    setPadding(3, 3, 3, 3);
    
    mTitle="";
    
    }
    
    public void setTitle(String title)
    
    {
    
    mTitle = title;
    
    requestLayout();
    
    invalidate();
    
    }
    
    public void setTextColor(int color)
    
    {
    
    mTextPaint.setColor(color);
    
    invalidate();
    
    }
    
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)
    
    {
    
    int strCount = 0;
    
    textList.removeAll(textList);
    
    StringBuilder strBuilder = new StringBuilder();
    
    strBuilder.append(mText);
    
    int specMode = MeasureSpec.getMode(widthMeasureSpec);
    
    mTextHeight = Math.abs(mTextPaint.getFontMetricsInt().top)
    
    + Math.abs(mTextPaint.getFontMetricsInt().bottom)
    
    + mTextPaint.getFontMetricsInt().leading;
    
    mAscent = (int) (-mTextPaint.ascent() + mTextPaint.descent());
    
    if (specMode == MeasureSpec.EXACTLY)
    
    {
    
    width = MeasureSpec.getSize(widthMeasureSpec);
    
    do
    
    {
    
    int count = mTextPaint.breakText(strBuilder.substring(0), true,
    
    width - 2 * border_width, null);
    
    String str = new String(strBuilder.substring(0, count));
    
    textList.add(str);
    
    strBuilder.delete(0, count);
    
    strCount += count;
    
    } while (strCount < mText.length());
    
    }
    
    height = textList.size() * mTextHeight + mTextHeight
    
    + mTextPaint.getFontMetricsInt().leading;
    
    setMeasuredDimension(width, height + 20);
    
    }
    
    protected void onDraw(Canvas canvas)
    
    {
    
    final int radius_x = 10;
    
    final int radius_y = 10;
    
    final int space = 2;
    
    final int offset_height = 20;
    
    final int offset_one = 30;
    
    final int offset_two = offset_one + 10;
    
    final int offset_three = offset_two + 10;
    
    int text_y = 0;
    
    int text_x = 0;
    
    Path path = new Path();
    
    RectF rect = new RectF(space, space, width - space, height);
    
    path.addRoundRect(rect, radius_x, radius_y, Direction.CW);
    
    path.moveTo(space + offset_one, height);
    
    path.lineTo(space + offset_two, height + offset_height);
    
    path.lineTo(space + offset_three, height);
    
    path.close();
    
    mTextPaint.setColor(Color.WHITE);
    
    mTextPaint.setStyle(Paint.Style.FILL);
    
    canvas.drawPath(path, mTextPaint);
    
    mTextPaint.setColor(Color.BLUE);
    
    canvas.drawText(mTitle, text_x + 5, text_y + mAscent, mTextPaint);
    
    mTextPaint.setColor(Color.GREEN);
    
    canvas.drawLine(space, mTextHeight + 1, width - space, mTextHeight + 1,
    
    mTextPaint);
    
    mTextPaint.setColor(Color.DKGRAY);
    
    for (int i = 0; i < textList.size(); i++)
    
    {
    
    canvas.drawText(textList.get(i), text_x + 5, text_y + mAscent + i
    
    * mTextHeight + mTextHeight, mTextPaint);
    
    }
    
    }
    
    }
    
     
    <!--round_rect_label.xml-->
    
    <?xml version="1.0" encoding="utf-8"?>
    
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    
    xmlns:app="http://schemas.android.com/apk/res/jack.label"
    
    android:orientation="vertical" android:layout_width="fill_parent"
    
    android:layout_height="wrap_content">
    
    <jack.label.RoundRectLabelView
    
    android:background="#7f00" android:layout_width="fill_parent"
    
    android:layout_height="wrap_content" app:titleText="我是标题,红色背景的"
    
    app:text="文本测试" />
    
    <jack.label.RoundRectLabelView
    
    android:background="@drawable/blue" android:layout_width="fill_parent"
    
    android:layout_height="wrap_content" app:titleText="我是标题,蓝色背景的"
    
    app:text="测试文本中英文混合,自动换行,测试文本中英文混合,自动换行,测试文本中英文混合,自动换行,测试文本中英文混合,自动换行,测试文本中英文混合,自动换行,"
    
    app:textSize="20dp" />
    
    <jack.label.RoundRectLabelView
    
    android:background="@drawable/green" android:layout_width="fill_parent"
    
    android:layout_height="wrap_content"
    
    app:titleText="我是标题,绿色背景的"
    
    app:text="大字体测试"
    
    app:textSize="30dp"
    
    app:textColor="#ffffffff" />
    
    </LinearLayout>
    
    <!--attrs.xml-->
    
    <?xml version="1.0" encoding="utf-8"?>
    
    <resources>
    
    <declare-styleable name="TogglePrefAttrs">
    
    <attr name="android:preferenceLayoutChild" />
    
    </declare-styleable>
    
    <declare-styleable name="Gallery1">
    
    <attr name="android:galleryItemBackground" />
    
    </declare-styleable>
    
    <declare-styleable name="LabelView">
    
    <attr name="text" format="string" />
    
    <attr name="titleText" format ="string"/>
    
    <attr name="textColor" format="color" />
    
    <attr name="textSize" format="dimension" />
    
    </declare-styleable>
    
    </resources>
    
    <!--colors.xml-->
    
    <?xml version="1.0" encoding="utf-8"?>
    
    <resources>
    
    <drawable name="red">#7f00</drawable>
    
    <drawable name="blue">#770000ff</drawable>
    
    <drawable name="green">#7700ff00</drawable>
    
    <drawable name="yellow">#77ffff00</drawable>
    
    </resources>
    
    <!--strings.xml-->
    
    <?xml version="1.0" encoding="utf-8"?>
    
    <resources>
    
    <string name="hello">Hello World, RoundRectLabel!</string>
    
    <string name="app_name">RoundRectLabel</string>
    
    </resources>
    
    <!--AndroidManifest.xml-->
    
    <?xml version="1.0" encoding="utf-8"?>
    
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
    
    package="jack.label"
    
    android:versionCode="1"
    
    android:versionName="1.0">
    
    <application android:icon="@drawable/icon" android:label="@string/app_name">
    
    <activity android:name=".RoundRectLabel"
    
    android:label="@string/app_name">
    
    <intent-filter>
    
    <action android:name="android.intent.action.MAIN" />
    
    <category android:name="android.intent.category.LAUNCHER" />
    
    </intent-filter>
    
    </activity>
    
    </application>
    
    </manifest>
  • 相关阅读:
    嵌入式Linux系统的构成和启动过程
    Linux 设备驱动之字符设备
    Linux的inode的理解
    flannel流程解析
    http2协议的理解
    多线程和单线程的理解
    User Token简单总结
    前端组件开发方法论
    Electron踩坑记录
    2020年工作总结
  • 原文地址:https://www.cnblogs.com/sun_catboy/p/1723407.html
Copyright © 2011-2022 走看看