博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android:自定义View、Paint、Canvas、attrs、customview、path
阅读量:6615 次
发布时间:2019-06-24

本文共 6424 字,大约阅读时间需要 21 分钟。

第一种:oncreate里启动自定义view


Activity代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
import 
android.os.Bundle;
import 
android.app.Activity;
import 
android.view.Menu;
public 
class 
MainActivity 
extends 
Activity
{
    
/**
     
* 两种方法:
     
* 1.直接在layout里找到自定义控件
     
* 2.oncreate里启动自定义view
     
*/
    
@Override
    
protected 
void 
onCreate(Bundle savedInstanceState)
    
{
        
super
.onCreate(savedInstanceState);
                                                                                                                                                                          
        
//先new一个自定义view对象
        
VerticalTextView view = 
new 
VerticalTextView(
this
);
        
setContentView(view);
//        setContentView(R.layout.activity_main);
    
}
                                                                                                                                                                      
    
@Override
    
public 
boolean 
onCreateOptionsMenu(Menu menu)
    
{
        
getMenuInflater().inflate(R.menu.main, menu);
        
return 
true
;
    
}
                                                                                                                                                                      
}

View类代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
import 
android.content.Context;
import 
android.graphics.Bitmap;
import 
android.graphics.BitmapFactory;
import 
android.graphics.Canvas;
import 
android.graphics.Color;
import 
android.graphics.Paint;
import 
android.view.View;
public 
class 
VerticalTextView 
extends 
View
{
    
//定义一个自定义角度的文本
    
private 
Paint mPaint;
    
public 
VerticalTextView(Context context)
    
{
        
super
(context);
        
init();
    
}
                                                                                                                                                     
    
private 
void 
init()
    
{
        
mPaint = 
new 
Paint();
        
mPaint.setColor(Color.BLUE);
        
mPaint.setTextSize(
50
);
        
mPaint.setAntiAlias(
true
);
//设置抗锯齿
    
}
    
@Override
    
protected 
void 
onDraw(Canvas canvas)
    
{
        
super
.onDraw(canvas);
        
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.bg);
                                                                                                                                                         
        
canvas.rotate(
75
);
//        canvas.rotate(60,bitmap.getWidth()*2 , bitmap.getHeight()*2);
        
canvas.drawText(
"CanvasHello"
0
0
, mPaint);
        
canvas.drawBitmap(bitmap, 
0
0
, mPaint);
    
}
                                                                                                                                                     
}

第二种:直接在layout里找到自定义控件(直接新建custom view)

1.新建attrs文件,增加自定义属性:

增加属性内容:

1
2
3
4
5
<declare-styleable name=
"LabelView"
>
<attr name=
"text" 
format=
"string" 
/>
<attr name=
"textColor" 
format=
"color" 
/>
<attr name=
"textSize" 
format=
"dimension" 
/>
</declare-styleable>

或者:

1
2
3
4
5
6
7
8
9
<declare-styleable name=
"DraggableDot"
>
<attr name=
"radius" 
format=
"dimension" 
/>
<attr name=
"legend" 
format=
"string" 
/>
<attr name=
"anr"
>
    
<
enum 
name=
"none" 
value=
"0" 
/>
    
<
enum 
name=
"thumbnail" 
value=
"1" 
/>
    
<
enum 
name=
"drop" 
value=
"2" 
/>
</attr>
</declare-styleable>

范例:

1
2
3
4
5
6
7
<resources>
    
<declare-styleable name=
"MyView"
>
        
<attr name=
"mytext" 
format=
"string" 
/>
        
<attr name=
"mytextColor" 
format=
"color" 
/>
        
<attr name=
"mytextSize" 
format=
"dimension" 
/>
    
</declare-styleable>
</resources>

2.增加自己的命名空间,将android修改为自己的包名:

1
2
<RelativeLayout xmlns:android=
"http://schemas.android.com/apk/res/android"
xmlns:MyView=
"http://schemas.android.com/apk/res/com.example.aexh23_paint_canvas"

3.在layout中创建自定义view,设置自定义属性(控件包名记得修改):

1
2
3
4
5
6
7
8
9
<com.example.aexh23_paint_canvas.VerticalTextView
android:id=
"@+id/verticalTextView1"
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
MyView:mytext=
"HelloWorld"
MyView:mytextColor=
"#654321"
MyView:mytextSize=
"35sp"
android:layout_centerHorizontal=
"true"
android:layout_centerVertical=
"true" 
/>

范例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<RelativeLayout xmlns:android=
"http://schemas.android.com/apk/res/android"
    
xmlns:MyView=
"http://schemas.android.com/apk/res/com.example.aexh23_paint_canvas"
    
xmlns:tools=
"http://schemas.android.com/tools"
    
android:layout_width=
"match_parent"
    
android:layout_height=
"match_parent"
    
tools:context=
".MainActivity" 
>
    
<com.example.aexh23_paint_canvas.VerticalTextView
        
android:id=
"@+id/verticalTextView1"
        
android:layout_width=
"wrap_content"
        
android:layout_height=
"wrap_content"
        
MyView:mytext=
"HelloWorld"
        
MyView:mytextColor=
"#654321"
        
MyView:mytextSize=
"35sp"
        
android:layout_centerHorizontal=
"true"
        
android:layout_centerVertical=
"true" 
/>
</RelativeLayout>

4.在自定义view类中增加方法:

1
2
3
4
5
setTextColor(a.getColor(R.styleable.LabelView_textColor, 
0xFF000000
));
int 
textSize = a.getDimensionPixelOffset(R.styleable.LabelView_textSize, 
0
);
if 
(textSize > 
0
) {
    
setTextSize(textSize);
}

范例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
public 
class 
VerticalTextView 
extends 
View
{
    
/**
     
* 系统范例:LabelView
     
* 1.新建attrs文件,增加属性:
        
<declare-styleable name="LabelView">
        
<attr name="text" format="string" />
        
<attr name="textColor" format="color" />
        
<attr name="textSize" format="dimension" />
        
</declare-styleable>
        
//
        
<declare-styleable name="DraggableDot">
        
<attr name="radius" format="dimension" />
        
<attr name="legend" format="string" />
        
<attr name="anr">
            
<enum name="none" value="0" />
            
<enum name="thumbnail" value="1" />
            
<enum name="drop" value="2" />
        
</attr>
        
</declare-styleable>
        
                             
        
2.增加自己的命名空间,将android修改为自己的包名
        
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        
xmlns:MyView="http://schemas.android.com/apk/res/com.example.aexh23_paint_canvas"
                             
        
3.在layout中创建自定义view,增加属性
        
<com.example.aexh23_paint_canvas.VerticalTextView
        
android:id="@+id/verticalTextView1"
        
android:layout_width="wrap_content"
        
android:layout_height="wrap_content"
        
MyView:mytext="HelloWorld"
        
MyView:mytextColor="#654321"
        
MyView:mytextSize="35sp"
        
android:layout_centerHorizontal="true"
        
android:layout_centerVertical="true" />
                             
        
4.在自定义view类中增加方法
        
setTextColor(a.getColor(R.styleable.LabelView_textColor, 0xFF000000));
        
int textSize = a.getDimensionPixelOffset(R.styleable.LabelView_textSize, 0);
        
if (textSize > 0) {
            
setTextSize(textSize);
        
}
                             
     
*/
    
private 
Paint mPaint;
    
private 
CharSequence s;
    
private 
int 
c;
    
private 
int 
d;
                         
                         
    
public 
VerticalTextView(Context context, AttributeSet attrs)
    
{
        
super
(context, attrs);
        
TypedArray a = context.obtainStyledAttributes(attrs,
                
R.styleable.MyView);
        
s = a.getString(R.styleable.MyView_mytext);
        
c = a.getColor(R.styleable.MyView_mytextColor, 
0xFF000000
);
        
d = a.getDimensionPixelOffset(R.styleable.MyView_mytextSize, 
0
);
        
init();
        
a.recycle();
    
}
                         
    
//定义画笔
    
private 
void 
init()
    
{
        
mPaint = 
new 
Paint();
        
mPaint.setColor(c );
        
mPaint.setTextSize(d);
        
mPaint.setAntiAlias(
true
);
// 设置抗锯齿
    
}
                         
    
@Override
    
protected 
void 
onDraw(Canvas canvas)
    
{
        
super
.onDraw(canvas);
        
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.bg);
                             
        
canvas.rotate(
30
);
        
// canvas.rotate(60,bitmap.getWidth()*2 , bitmap.getHeight()*2);
        
canvas.drawText(s.toString(), 
0
0
, mPaint);
        
canvas.drawBitmap(bitmap, 
0
0
, mPaint);
                             
    
}
}
本文转自 glblong 51CTO博客,原文链接:http://blog.51cto.com/glblong/1228552,如需转载请自行联系原作者
你可能感兴趣的文章
Rabbitmq学习(一) Rabbitmq初探
查看>>
9.1-9.7 正则三剑客:grep、sed、awk
查看>>
JavaScript正则表达式(JavaScript:The Definitive Guide笔记)
查看>>
CSDN博客开通啦!
查看>>
自定义BeanUtils的赋值和获取方法实现.
查看>>
Docker加速器配置
查看>>
电脑上的PDF文件怎样转换成TXT
查看>>
探讨数据库的数据导入方法
查看>>
沙漠表情包如何制作 QQ表情包制作教程
查看>>
yii2下拉框带搜索功能
查看>>
memcache源码安装及测试
查看>>
springMVC+shiro 实现敏感词过滤 (spring boot 也可以参考)
查看>>
25道经典Java算法题
查看>>
“Heartbleed”漏洞分析与场景再现
查看>>
博客第一天
查看>>
远程操作linux网站常用命令
查看>>
JS代码给PDF文档加书签
查看>>
数据库中的悲观锁和乐观锁
查看>>
V4L2驱动程序架构-3
查看>>
ckeditor的使用(重要)
查看>>