关于android自定义view的方法
对于自定义的View如果没有自己独特的属性,可以直接在xml文件中使用就可以了
如果含有自己独特的属性,那么就需要在构造函数中获取属性文件attrs.xml中自定义属性的名称
并根据需要设定默认值,放在在xml文件中没有定义。
如果使用自定义属性,那么在应用xml文件中需要加上新的schemas,
比如这里是xmlns:my="http://schemas.android.com/apk/res/包名"
其中xmlns后的“my”是自定义的属性的前缀,res后的是我们应用所在的包
自定义属性的用法如下:
第一步:attrs.xml添加一段你自定义的属性名,还有格式:
<declare-styleable name = "TriangleViewAttr">
<attr name = "tricolor" format = "color" />
</declare-styleable>
第二步:xmlns:tri="http://schemas.android.com/apk/res/包名" 这句话需要加在最外层的layout属性中,或者加在view的属性里。
第三步:写进来添加的自定义属性<demo.view.def.MyView android:layout_width="fill_parent" android:layout_height="wrap_content" tri:tricolor="@color/ios_blue"/>
第四步:在onDraw方法里,调用:可以再context.obtainStyledAttributes(attrs, R.styleable.TriangleViewAttr);我这里重新提出了一个方法:
private void getAttr(Context context, AttributeSet attrs)
{
array = context.obtainStyledAttributes(attrs, R.styleable.TriangleViewAttr);
maincolor = array.getColor(R.styleable.TriangleViewAttr_tricolor, maincolor);//TriangleViewAttr_tricolor 就是TriangleViewAttr.tricolor
array.recycle();}
有一句:array.recycle();很重要,记得回收哦!
既然,已经获得指定的属性值。那么,第五步:
OK!那么,我把我的代码贴上来吧!
1.首先是attr.xml:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!--xmlns:triattr="http://schemas.android.com/apk/res/com.jsdx.zqysypt"-->
<!--triattr:tricolor="@color/mainact_lefttopblue"-->
<declare-styleable name = "TriangleViewAttr">
<attr name = "tricolor" format = "color" />
</declare-styleable>
</resources>
2.TriangleView类的代码:
package com.commons.widget.views;
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.util.AttributeSet;
import android.util.Log;
import android.view.View;
import com.jsdx.zqysypt.R;
/**
* Created by aa on 2015/1/12.
* 画一个三角形 三个点 1.最左上角 2.最左下角 3.右边的中间点; 如图:
* @*****
* *****@
* @*****
*
* 用法<TriangleView
* xmlns:tri="http://schemas.android.com/apk/res/包名"
* android:layout_width="12dp"
* android:layout_height="12dp"
* tri:tricolor="@color/ios_blue" />
*/
public class TriangleView extends View {
//默认颜色是透明的色彩
int maincolor=Color.TRANSPARENT;
//是否为等边三角
boolean isEquilateral=false;
//tri:tricolor="@color/ios_blue"
//TypedArray是一个用来存放由context.obtainStyledAttributes获得的属性的数组
//在使用完成后,一定要调用recycle方法
//属性的名称是styleable中的名称+“_”+属性名称
TypedArray array = null;
public TriangleView(Context context) {
super(context);
}
public TriangleView(Context context, AttributeSet attrs) {
super(context, attrs);
getAttr(context, attrs);
}
public TriangleView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
getAttr(context, attrs);
}
private void getAttr(Context context, AttributeSet attrs)
{
array = context.obtainStyledAttributes(attrs, R.styleable.TriangleViewAttr);
maincolor = array.getColor(R.styleable.TriangleViewAttr_tricolor, maincolor); //TriangleViewAttr_tricolor 就是TriangleViewAttr.tricolor
array.recycle();
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
// 创建画笔
Paint p = new Paint();
p.setColor(maincolor);// 设置红色
p.setStyle(Paint.Style.FILL);//设置填满
//获得几个点的数值
int width=getWidth();
int height=getHeight();
int loc_x=getLeft();
int loc_y=getTop();
Log.d("TriangleView",width+" "+height);
// 绘制这个三角形,你可以绘制任意多边形
Path path = new Path();
path.moveTo(0, 0);// 此点为多边形的起点
if(isEquilateral)
path.lineTo((height/2)*1.73205f, height/2); ///这里使用*1.73205f 是因为如果要画一个等边三角形的话需要用这个比例根号三一条直角边是另外一条直角边的 1.73205f 倍。
else
path.lineTo(width, height/2);
path.lineTo(0, height);
path.close(); // 使这些点构成封闭的多边形
canvas.drawPath(path, p);
}
/**重新设置颜色
* @param color
* (0xe96f4a)无效 (0xffe96f4a)这样就可以了
*/
public void showColor(int color)
{
maincolor=color;
this.invalidate();
}
}3.layout布局xml:
<com.commons.widget.views.TriangleView
xmlns:triattr="http://schemas.android.com/apk/res/com.jsdx.zqysypt"
android:layout_width="10dp"
android:layout_height="20dp"
android:layout_alignParentLeft="true"
android:layout_centerVertical="true"
triattr:tricolor="@color/mainact_lefttopblue" />
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。