您的位置:首页 > 移动开发 > Android开发

Android:自定义View(一)

2015-09-18 12:30 417 查看

Android:自定义View(一)

自定义View:

就是继承系统的View,通过添加绘制元素,逻辑以实现自己想要实习的效果的控件。在Android开发过程中,我们想要的效果大多数情况下可以直接使用系统提供的控件来实现,
但是还是有很多效果是系统没有提供的,这时候就需要我们自己定义实现View控件或者使用第三方的自定义View控件

编写自定义View:

首先我们来实现一个简单的自定义VIew,具有View的特性,但是什么都不显示

1.首先新建一个工程——Myview
2.在MainActivity所在包下新建一个类——MyView (MyView.java) 代码如下:
<span style="font-size:14px;">package com.test.myview;

import android.content.Context;
import android.util.AttributeSet;
import android.view.View;

public class MyView extends View{

public MyView(Context context, AttributeSet attrs) {
super(context, attrs);
}

public MyView(Context context) {
super(context);
}

}</span>
3.把自定义View添加到布局当中 (activity_main.xml) 代码如下:
<span style="font-size:14px;"><FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent" >

<com.test.myview.MyView
android:layout_width="match_parent"
android:layout_height="match_parent" />

</FrameLayout></span>

这样我们最简单的自定义View就完成了,运行下看看结果 如图所示:



看起来是什么都没显示,毕竟我们在MyView中什么也没有做,但是毕竟它继承了系统的View还是具有系统View的一些属性的,接下来我们来稍微改变一下看看效果,新的activity_main.xml内容:
<span style="font-size:14px;"><FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent" >

<com.test.myview.MyView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#00ff00"/>

</FrameLayout></span>
此时我们运行发现界面已经变成了我们设置的颜色,这说明我们自定的View还是可以使用系统View的background属性的。

4 加入绘制元素
上面那个自然不能满足我们的需要,接下来我们来加入绘制元素,绘制元素是通过View提供的一个方法——onDraw方法
<span style="font-size:14px;">	@Override
protected void onDraw(Canvas canvas)
{
super.onDraw(canvas);
}</span>
我们单击onDraw找到View.class中onDraw的定义:
<span style="font-size:14px;">/**
* Implement this to do your drawing.
*
* @param canvas the canvas on which the background will be drawn
*/
protected void onDraw(Canvas canvas) {
}</span>
发现其实在基类中(View中),onDraw方法中其实并没有做任何事,所以我们可以删掉super.onDraw(canvas)。我们可以在onDraw中绘制哪些东西呢?canvas中包含文字,图形,
bitmap,这些都是我们可以绘制的。我们先在onDrawe方法中绘制文字,图形,代码如下(MyView.java):

<span style="font-size:14px;">package com.test.myview;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Paint.Style;
import android.graphics.Rect;
import android.graphics.RectF;
import android.util.AttributeSet;
import android.view.View;

public class MyView extends View{

private Bitmap bitmap;

public MyView(Context context, AttributeSet attrs) {
super(context, attrs);
bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher);
}

public MyView(Context context) {
super(context);
}
@Override
protected void onDraw(Canvas canvas)
{
//Paint类拥有颜色和类型信息关于如何绘制图形,文本,bitmaps
Paint paint = new Paint();
//设置文字
paint.setTextSize(30);
//设置颜色
paint.setColor(0xffff0000);//默认是黑色
//设置空心
paint.setStyle(Style.STROKE);
canvas.drawText("Hello View", 0, 30, paint);
//绘制直线
canvas.drawLine(0, 60, 100, 60, paint);
//绘制矩形方法一
canvas.drawRect(0, 90, 100, 190, paint);
//绘制矩形方法二
Rect r = new Rect(110,90,210,190);//参数是int型
canvas.drawRect(r, paint);
//绘制矩形方法三
RectF rect = new RectF(0,200,100,290);//蚕食其实是float值
canvas.drawRect(rect, paint);
//绘制图片
canvas.drawBitmap(bitmap, 110, 200, paint);
}
}</span>
运行结构如下图所示:



上面是在布局中实现了我们的自定义View,那怎么在代码中实现自定义View呢?我们打开MainActivity.java,把
setContentView(R.layout.activity_main); 改为: setContentView(new MyView(this)); 然后在MyView类的MyView(Context context)构造方法中实例化bitmap。
再次运行我们可以得到下图所示结果:



我们发现背景已经没有了!!这是因为我们在布局中设置了背景但是在代码中并没有设置背景颜色。

示例源码下载: http://download.csdn.net/detail/cassiepython/9117091
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: