画画 可以在 view 和SurfaceView上面画
SurfaceView继承view 更加平滑 适合动画
在view上画画
最简单的 需要什么呢:
1 得到画布:继承view实现onDraw()在他里面画画了。他决定了 你画的是什么形状 比如 菱形椭圆等待呢个
2得到画笔:设置Paint (画笔) 决定了你是 用铅笔 毛笔等等 决定粗细 颜色 硬度等等
其中有一个函数叫Invalidate()
作用是刷新 画完刷一下 开始画 。可以画出闪烁等样子了。。
如果在子线程中 就要用postInvalidate()方法了。这个等于发送一个handler
在主线程中更新界面
ui都是由view和viewGroup组成的
view理解为各种控件
viewGroup理解为LinearLayout 等各种布局 。。。
空间要在布局里面才可以显示 不然就乱了。。
所以android定义的是
ViewGroup
ViewGroup view
view view view view
这个结构就可看出 所有要定义 控件先定义一个布局
在界面上定义一个Butten按钮方法两种
1动态定义
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
|
package com.example.view; import java.util.concurrent.ConcurrentHashMap; import android.app.Activity; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.LinearLayout; import android.widget.Toast; import android.widget.LinearLayout.LayoutParams; public class CustomViewActivity extends Activity
{ @Override protected void onCreate(Bundle
savedInstanceState) { //
TODO Auto-generated method stub super .onCreate(savedInstanceState); LinearLayout
linearLayout = new LinearLayout( this ); linearLayout.setLayoutParams( new LinearLayout.LayoutParams( LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT) ); Button
button = new Button( this ); button.setText( "wang
button" ); button.setLayoutParams( new LayoutParams( android.view.ViewGroup.LayoutParams.WRAP_CONTENT, android.view.ViewGroup.LayoutParams.WRAP_CONTENT)); setContentView(linearLayout); } } |
一般都是
setContentView(R.layout.xx);的形式
但xml和LinearLayout都是view所以也可以
这样就
完全没有xml定义了button。
1
xml定义
text.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
<RelativeLayout
xmlns:android= "http://schemas.android.com/apk/res/android" xmlns:tools= "http://schemas.android.com/tools" android:layout_width= "match_parent" android:layout_height= "match_parent" android:paddingBottom= "@dimen/activity_vertical_margin" android:paddingLeft= "@dimen/activity_horizontal_margin" android:paddingRight= "@dimen/activity_horizontal_margin" android:paddingTop= "@dimen/activity_vertical_margin" tools:context= ".MainActivity" > <TextView android:layout_width= "match_parent" android:layout_height= "wrap_content" /> <Button android:id= "@+id/AA" android:layout_width= "wrap_content" android:layout_height= "wrap_content" android:text= "@string/hello_world" /> </RelativeLayout> |
在activity中setContentView(linearLayout);改为setContentView(R.layout.text);
下面就画一个简单的 红色正方形 写上字 有监听事件的
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
30
31
32
33
34
|
package com.example.view; import java.util.concurrent.ConcurrentHashMap; import android.app.Activity; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.LinearLayout; import android.widget.Toast; import android.widget.LinearLayout.LayoutParams; public class CustomViewActivity extends Activity
{ @Override protected void onCreate(Bundle
savedInstanceState) { //
TODO Auto-generated method stub super .onCreate(savedInstanceState); CostomView
cv = new CostomView( this ); cv.setOnClickListener( new OnClickListener()
{ @Override public void onClick(View
v) { //
TODO Auto-generated method stub Toast.makeText(CustomViewActivity. this , "hello
word" , 1 ).show(); } }); setContentView(cv); } } |
CostomView中
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
|
package com.example.view; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Matrix; import android.graphics.Paint; import android.graphics.RectF; import android.view.View; public class CustomView extends View
{ private Paint
paint; public CustomView(Context
context) { super (context); //
TODO Auto-generated constructor stub } @Override protected void onDraw(Canvas
canvas) { //
TODO Auto-generated method stub super .onDraw(canvas); paint= new Paint(); paint.setColor(Color.RED); //drawRect canvas.drawRect( 10 , 10 , 90 , 90 ,
paint); //
canvas.clipRect(20, 50, 180, 170);//裁剪 canvas.rotate(40f); canvas.save(); //drawText paint.setColor(Color.BLACK); canvas.drawText( "helloview" , 20 , 20 ,
paint); //drawOval paint.setColor(Color.BLUE); paint.setAntiAlias( true ); RectF
oval = new RectF( 20 , 10 , 100 , 120 ); canvas.drawOval(oval,
paint); canvas.restore(); //
canvas.setMatrix(matrix); } } |
其中canvas.save()保存斜的画布 为正常的。。canvas.restore();取出保存的内容 。感觉很难理解。。
我们如果单独处理一张图片的时候,而且不想影响其他部分的绘制
上面代码 就让 红色的方形 不懂 文字和椭圆 转了
用canvas画图
常用的draw****
drawRect 长方形 矩形
drawCircle 园
drawOval椭圆
drawPath 路径 不规则图形
drawLine 一条线
drawPoint 一个点
drawText 画一个文字
drawColor 画一个背景色
drawBitmap 画一个图片