Android重写View并自定义属性实例分析

本文实例分析了Android重写View并自定义属性的方法。分享给大家供大家参考,具体如下:

这里通过自定义属性 实现如下图所示效果:

第一步:在res\values的目录下新建一个文件attrs.xml

声明一些自定义属性

<?xml version="1.0" encoding="utf-8"?>
<resources>
  <declare-styleable name="CustomViewStyle">
    <attr name="customText" format="string" />
    <attr name="customTextColor" format="color" />
    <attr name="customTextSize" format="dimension" />
  </declare-styleable>
</resources>

第二步:在layout目录下新建布局文件activity_main.xml

特别注意要在外层控件加上这个声明:

格式:xmlns:(你自定义名称)="http://schemas.android.com/apk/(你应用的包名)"

xmlns:xr="http://schemas.android.com/apk/res/com.rong.test"

或者

xmlns:xr="http://schemas.android.com/apk/res-auto"

推荐使用第二种

在布局文件中加入这些自定义的属性:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:xr="http://schemas.android.com/apk/res/com.rong.test"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:background="@android:color/black"
  android:orientation="vertical" >
  <com.rong.activity.CustomView
    android:layout_width="300dp"
    android:layout_height="300dp"
    android:layout_centerInParent="true"
    android:background="#ff0000"
    xr:customText="自定义控件"
    xr:customTextColor="#000000"
    xr:customTextSize="40sp" />
</RelativeLayout>

第三部继承View重写

package com.rong.activity;
import com.rong.test.R;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.util.AttributeSet;
import android.view.View;
/**
 * 自定义控件
 *
 * @author 徐荣
 *
 */
public class CustomView extends View {
  /**
   * 自定义画笔
   */
  private Paint mPaint;
  /**
   * 文字范围
   */
  private Rect mBounds;
  /**
   * 自定义文字
   */
  private String customText;
  /**
   * 自定义大小
   */
  private int customTextSize;
  /**
   * 自定义颜色
   */
  private int customTextColor;
  public CustomView(Context context, AttributeSet attrs) {
    super(context, attrs);
    TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.CustomViewStyle);
    // 获取自定义文字
    customText = typedArray.getString(R.styleable.CustomViewStyle_customText);
    // 获取自定义文字大小
    customTextSize = typedArray.getDimensionPixelSize(R.styleable.CustomViewStyle_customTextSize, 28);
    // 或者自定义文字颜色
    customTextColor = typedArray.getColor(R.styleable.CustomViewStyle_customTextColor, Color.WHITE);
    // 要回收这个typedArray对象
    typedArray.recycle();
    initView();
  }
  public void initView() {
    // 初始化画笔
    mPaint = new Paint();
    mPaint.setAntiAlias(true);
    mPaint.setStyle(Paint.Style.FILL);
    mPaint.setColor(customTextColor);
    mPaint.setTextSize(customTextSize);
    // 生成文字区域
    mBounds = new Rect();
  }
  @Override
  protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    // 获取文字显示区域mBounds
    mPaint.getTextBounds(customText, 0, customText.length(), mBounds);
    //使文字宽居中显示=控件的宽度/2 -文字的宽度/2
    float helfWidth = getWidth() / 2 - mBounds.width() / 2;
    //使文字高居中显示=控件的宽度/2 +文字的宽度/2
    float helfHeight = getHeight() / 2+mBounds.height()/2;
    //绘制文字
    canvas.drawText(customText, helfWidth, helfHeight, mPaint);
  }
}

运行!

更多关于Android相关内容感兴趣的读者可查看本站专题:《Android开发入门与进阶教程》、《Android基本组件用法总结》、《Android视图View技巧总结》、《Android布局layout技巧总结》及《Android控件用法总结》

希望本文所述对大家Android程序设计有所帮助。

(0)

相关推荐

  • Android重写TextView实现文字整齐排版的方法(附demo源码下载)

    本文实例讲述了Android重写TextView实现文字整齐排版的方法.分享给大家供大家参考,具体如下: XRTextView类 package rong.android.test; import org.json.JSONArray; import org.json.JSONException; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; impor

  • Android实现树形层级ListView

    直接贴代码,代码中有相应注释: 主界面Activity,布局就只一个ListView: public class MainActivity extends Activity { private ListView mListView; private TreeListViewAdapter<TestBean> mAdapter; private List<TestBean> mDatas = new ArrayList<TestBean>(); @Override pro

  • Android TreeView效果实现方法(附demo源码下载)

    本文实例讲述了Android TreeView效果实现方法.分享给大家供大家参考,具体如下: 应该说很多的操作系统上面都提供了TreeView空间,实现树形结构,这个树形结构的应用时很广泛的,而Google开发Android的时候出于Android手机是触摸屏幕的考虑,用手指操作树形结构很不方便,从这方面考虑没有提供TreeView的空间,而是只是提供了一个ExpandableListView:android中的二级树型Widget,虽然已经能满足不少的功能需求,例如书签的功能就可以使用这个控件

  • Android手势滑动实现ImageView缩放图片大小

    本文推出了两种Android手势实现ImageView缩放图片大小的方法,分享给大家供大家参考,具体内容如下 方法一: 将以下代码写到MulitPointTouchListener.java中,然后对你相应的图片进行OnTouchListener. 例如:imageView.setOnTouchListener(new MulitPointTouchListener ()); 在xml中要将ImageView的缩放格式改成Matrix 例如:android:scaleType="matrix&q

  • Android之IphoneTreeView带组指示器的ExpandableListView效果

    之前实现过一次这种效果的ExpandableListView:http://www.jb51.net/article/38482.htm,带效果比较挫,最近,在参考联系人源码PinnedHeaderListView,以及网上各位大侠的源码,封装了一个效果最好,而且使用最简单的IphoneTreeView,下面先看看效果图:  首先让我们看看封装得比较完善的IphoneTreeView: 复制代码 代码如下: public class IphoneTreeView extends Expandab

  • Android设置TextView显示指定个数字符,超过部分显示...(省略号)的方法

    本文实例讲述了Android设置TextView显示指定个数字符,超过部分显示...(省略号)的方法.分享给大家供大家参考,具体如下: 一.问题: 今天在公司遇到一个需求:TextView设置最多显示8个字符,超过部分显示...(省略号) 二.解决方法: 网上找了很多资料,有人说分别设置TextView的android:signature="true",并且设置android:ellipsize="end";但是我试了,并没有成功,最后自己试出一种方式如下:供大家参

  • Android提高之多级树形菜单的实现方法

    一般来说在Android里要实现树形菜单,都是用ExpandableList(也有高手自己继承ListView或者LinearLayout来做),但是ExpandableList一般只能实现2级树形菜单.本文所述实例也依然使用ExpandableList,但是要实现的是3级树形菜单. 本文程序运行效果图如下图所示: 当用BaseExpandableListAdapter来实现二级树形菜单时,父项(getGroupView())和子项(getChildView())都是使用TextView.当要实

  • Android获取屏幕或View宽度和高度的方法

    本文实例讲述了Android获取屏幕或View宽度和高度的方法.分享给大家供大家参考,具体如下: 在Activity中获取屏幕的高度和宽度 Display display=getWindowManager().getDefaultDisplay(); int width=display.getWidth(); int height=display.getHeight(); 在重写ViewGroup中获取屏幕的有效宽度和高度在OnMesure方法中 protected void onMeasure

  • Android实现ImageView图片双击放大及缩小

    本文实例介绍了Android实现ImageView图片双击放大及缩小的相关技巧,分享给大家供大家参考,具体内容如下 public class DoubleScaleImageView extends ImageView implements OnTouchListener, OnGlobalLayoutListener { private boolean isFirst = false; private float doubleScale;// 双击放大的值 private Matrix mSc

  • 自己实现的android树控件treeview

    1.开发原因在项目中经常需要一个需要一个树状框架,这是非常常见的控件.不过可能是谷歌考虑到android是手机系统,界面宽度有限,所以只提供了只有二级的ExpandableListView.虽然这个控件可以满足很多需求,但是无数级的树在某些情况下还是需要的,所以我花了一天时间(大部分时间都在调试动画去了,不过现在动画还有点问题,具体原因不明..如果某位大神能找到原因灰常感谢). 2.原理 网上很多都是扩展listview实现的,不过listview貌似不支持复杂控件的事件?而且做动画也不方便,所

  • Android中使用TextView实现图文混排的方法

    向TextView或EditText中添加图像比直接添加文本复杂一点点,需要用到<img>标签. <img>只有一个src属性,该属性原则上应该指向一个图像地址或可以找到某个图像资源的唯一标识.但要注意的是,系统并不会直接根据src属性所指的值自动获取和显示图像,这一切都需要我们去做.说白了,src属性指的是什么只有开发者自己知道.开发者需要告诉系统src属性到底指的是什么,然后系统才会知道怎么做. 解析src属性值需要ImageGetter对象的getDrawable方法来完成.

随机推荐