这两篇文章不可错过,是最靠谱的基础文献。总的来说,如果想完全定制,就继承与于View类;如果只是在原有控件基础上拓展,那就继承TextView、Button或者LinearLayout等。接下来,就以实例的形式,逐步掌握这方面的技能。

下面就自定义一个类,用来画一个圆圈:

  1. <pre class="html" name="code" snippet_file_name="blog_20140110_1_5174710" code_snippet_id="150430">import android.content.Context;
  2. import android.graphics.Canvas;
  3. import android.graphics.Color;
  4. import android.graphics.Paint;
  5. import android.graphics.Path;
  6. import android.graphics.Path.Direction;
  7. import android.util.AttributeSet;
  8. import android.view.View;
  9. public class GraphicsView extends View {
  10. //用于画路径、线条等
  11. private Path circle;
  12. //画笔
  13. private Paint cPaint;
  14. public GraphicsView(Context context) {
  15. super(context);
  16. initView();
  17. }
  18. public GraphicsView(Context context, AttributeSet attrs) {
  19. super(context, attrs);
  20. // TODO Auto-generated constructor stub
  21. initView();
  22. }
  23. public GraphicsView(Context context, AttributeSet attrs, int defStyleAttr) {
  24. super(context, attrs, defStyleAttr);
  25. // TODO Auto-generated constructor stub
  26. initView();
  27. }
  28. private void initView(){
  29. circle = new Path();
  30. //画一个轮廓
  31. circle.addCircle(150, 150, 100, Direction.CW);
  32. //设置画笔
  33. cPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
  34. cPaint.setStyle(Paint.Style.STROKE);
  35. cPaint.setColor(Color.LTGRAY);
  36. cPaint.setStrokeWidth(3);
  37. //设置背景
  38. setBackgroundResource(R.drawable.ic_launcher);
  39. }
  40. @Override
  41. public void draw(Canvas canvas) {
  42. // TODO Auto-generated method stub
  43. super.draw(canvas);
  44. canvas.drawPath(circle, cPaint);
  45. }
  46. }
  47. </pre><br>
  1. import android.content.Context;
  2. import android.graphics.Canvas;
  3. import android.graphics.Color;
  4. import android.graphics.Paint;
  5. import android.graphics.Path;
  6. import android.graphics.Path.Direction;
  7. import android.util.AttributeSet;
  8. import android.view.View;
  9. public class GraphicsView extends View {
  10. //用于画路径、线条等
  11. private Path circle;
  12. //画笔
  13. private Paint cPaint;
  14. public GraphicsView(Context context) {
  15. super(context);
  16. initView();
  17. }
  18. public GraphicsView(Context context, AttributeSet attrs) {
  19. super(context, attrs);
  20. // TODO Auto-generated constructor stub
  21. initView();
  22. }
  23. public GraphicsView(Context context, AttributeSet attrs, int defStyleAttr) {
  24. super(context, attrs, defStyleAttr);
  25. // TODO Auto-generated constructor stub
  26. initView();
  27. }
  28. private void initView(){
  29. circle = new Path();
  30. //画一个轮廓
  31. circle.addCircle(150, 150, 100, Direction.CW);
  32. //设置画笔
  33. cPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
  34. cPaint.setStyle(Paint.Style.STROKE);
  35. cPaint.setColor(Color.LTGRAY);
  36. cPaint.setStrokeWidth(3);
  37. //设置背景
  38. setBackgroundResource(R.drawable.ic_launcher);
  39. }
  40. @Override
  41. public void draw(Canvas canvas) {
  42. // TODO Auto-generated method stub
  43. super.draw(canvas);
  44. canvas.drawPath(circle, cPaint);
  45. }
  46. }
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.Path.Direction;
import android.util.AttributeSet;
import android.view.View; public class GraphicsView extends View {
//用于画路径、线条等
private Path circle;
//画笔
private Paint cPaint; public GraphicsView(Context context) {
super(context); initView();
} public GraphicsView(Context context, AttributeSet attrs) {
super(context, attrs);
// TODO Auto-generated constructor stub
initView();
} public GraphicsView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
// TODO Auto-generated constructor stub
initView();
} private void initView(){
circle = new Path();
//画一个轮廓
circle.addCircle(150, 150, 100, Direction.CW);
//设置画笔
cPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
cPaint.setStyle(Paint.Style.STROKE);
cPaint.setColor(Color.LTGRAY);
cPaint.setStrokeWidth(3);
//设置背景
setBackgroundResource(R.drawable.ic_launcher);
} @Override
public void draw(Canvas canvas) {
// TODO Auto-generated method stub
super.draw(canvas);
canvas.drawPath(circle, cPaint);
} }

我们是继承了View,并且实现了全部三个构造方法。在这个地方需要注意一下,如果你的view不是在xml中,而且也不打算使用什么样式,那么就无需实现带有AttributeSet attrs, int defStyleAttr这样的构造方法,因为用不到样式什么的。比如在activity中就可以这样使用:

  1. import android.os.Bundle;
  2. import android.view.Menu;
  3. import android.app.Activity;
  4. public class MainActivity extends Activity {
  5. @Override
  6. protected void onCreate(Bundle savedInstanceState) {
  7. super.onCreate(savedInstanceState);
  8. setContentView(new GraphicsView(context));
  9. }
  10. @Override
  11. public boolean onCreateOptionsMenu(Menu menu) {
  12. getMenuInflater().inflate(R.menu.main, menu);
  13. return true;
  14. }
  15. }
import android.os.Bundle;
import android.view.Menu;
import android.app.Activity; public class MainActivity extends Activity { @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(new GraphicsView(context));
} @Override
public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.main, menu);
return true;
} }

但是,上面这个类已经实现了所有构造方法,那么就可以在布局文件里使用了,如下:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent"
  5. android:orientation="vertical" >
  6. <com.example.apptest.GraphicsView
  7. android:id="@+id/graphics"
  8. android:layout_width="match_parent"
  9. android:layout_height="match_parent" />
  10. </LinearLayout>
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" > <com.example.apptest.GraphicsView
android:id="@+id/graphics"
android:layout_width="match_parent"
android:layout_height="match_parent" /> </LinearLayout>

对应的activity就是这样:

  1. import android.os.Bundle;
  2. import android.view.Menu;
  3. import android.app.Activity;
  4. public class MainActivity extends Activity {
  5. @Override
  6. protected void onCreate(Bundle savedInstanceState) {
  7. super.onCreate(savedInstanceState);
  8. setContentView(R.layout.activity_main);
  9. }
  10. @Override
  11. public boolean onCreateOptionsMenu(Menu menu) {
  12. getMenuInflater().inflate(R.menu.main, menu);
  13. return true;
  14. }
  15. }
import android.os.Bundle;
import android.view.Menu;
import android.app.Activity; public class MainActivity extends Activity { @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
} @Override
public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.main, menu);
return true;
} }

效果看起来就是这样的:

自定义view的更多相关文章

  1. 自定义view(一)

    最近在学习自定义view  一遍看一别学顺便记录一下 1.View的测量-------->onMeasure() 首先,当我们要画一个图形的时候,必须知道三个数据:位置,长度,宽度   才能确定 ...

  2. Android 自定义View及其在布局文件中的使用示例

    前言: 尽管Android已经为我们提供了一套丰富的控件,如:Button,ImageView,TextView,EditText等众多控件,但是,有时候在项目开发过程中,还是需要开发者自定义一些需要 ...

  3. Android自定义View之圆环交替 等待效果

    学习了前面两篇的知识,对于本篇实现的效果,相信大家都不会感觉太困难,我要实现的效果是什么样呢?下面请先看效果图: 看上去是不很炫的样子,它的实现上也不是很复杂,重点在与onDraw()方法的绘制. 首 ...

  4. Android自定义View初步

    经过上一篇的介绍,大家对于自定义View一定有了一定的认识,接下来我们就以实现一个图片下显示文字的自定义View来练习一下.废话不多说,下面进入我们的正题,首先看一下我们的思路,1.我们需要通过在va ...

  5. Android之自定义View的实现

    对于学习Android开发的小童鞋对于自定义View一定不会陌生,相信大家对它是又爱又恨,爱它可以跟随我们的心意设计出漂亮的效果:恨它想要完全流畅掌握,需要一定的功夫.对于初学者来说确实很不容易,网上 ...

  6. [转]Android自定义控件三部曲系列完全解析(动画, 绘图, 自定义View)

    来源:http://blog.csdn.net/harvic880925/article/details/50995268 一.自定义控件三部曲之动画篇 1.<自定义控件三部曲之动画篇(一)—— ...

  7. 通过圆形载入View了解自定义View

    这是自定义View的第一篇文章,通过制作简单的自定义View来了解自定义View的流程. 自定义View是Android学习和开发中必不可少的一部分.通过自定义View我们可以制作丰富绚丽的控件,自定 ...

  8. 自定义view(二)

    1.View 的绘制 通过继承View 并重写它的onDraw()来完成绘制. onDraw()有一个参数,就是Canvas对象.使用这个Canvas就可以绘制图像了,Canvas canvas = ...

  9. salesforce 零基础学习(五十)自定义View或者List以及查看系统原来的View或者List

    salesforce给我们提供了标准的页面,比如标准的页面包括标准的列表和标准的详细页视图.有的时候我们想要自定义视图,比如做一个项目的时候不希望使用者直接通过ID查看到标准的详细页,而是跳转到指定处 ...

  10. Android自定义View 画弧形,文字,并增加动画效果

    一个简单的Android自定义View的demo,画弧形,文字,开启一个多线程更新ui界面,在子线程更新ui是不允许的,但是View提供了方法,让我们来了解下吧. 1.封装一个抽象的View类   B ...

随机推荐

  1. 李洪强iOS经典面试题124

    1. Object-c的类可以多重继承么?可以实现多个接口么?Category是什么?重写一个类的方式用继承好还是分类好?为什么? 答: Object-c的类不可以多重继承;可以实现多个接口,通过实现 ...

  2. Java中的super与this解析

    好了,现在开始讨论this&super这两个关键字的意义和用法. 在Java中,this通常指当前对象,super则指父类的.当你想要引用当前对象的某种东西,比如当前对象的某个方法,或当前对象 ...

  3. [LintCode] Reverse Nodes in k-Group 每k个一组翻转链表

    Given a linked list, reverse the nodes of a linked list k at a time and return its modified list. If ...

  4. [zt]矩阵求导公式

    今天推导公式,发现居然有对矩阵的求导,狂汗--完全不会.不过还好网上有人总结了.吼吼,赶紧搬过来收藏备份. 基本公式:Y = A * X --> DY/DX = A'Y = X * A --&g ...

  5. Odoo中的Javascript单元测试

    前端页面利用QUnit进行单元测试,本文参考官方文档:https://www.odoo.com/documentation/8.0/reference/javascript.html 访问/web/t ...

  6. Java I/O Basic

    /* 记住每个类相应的用法*/流的分类: io包内定义了所有的流 分类: 方向:输入流.输出流 处理数据单位:字节流.字符流 功能不同:节点流.处理流 所有流类型,位于java.io包内,分别继承以下 ...

  7. 一段能导致火狐、谷歌Safari浏览器崩溃,甚至让iPhone重启的代码

    JavaScript代码,能导致火狐.谷歌Safari浏览器崩溃,甚至让iPhone重启 <html> <body> <script> var total = &q ...

  8. iOS Mail.app inject kit

    from:https://github.com/jansoucek/iOS-Mail.app-inject-kit 测试机:iOS 8.2 发一封邮件. Apple ID的重要性不言而喻,这种钓鱼手法 ...

  9. svn版本升级遇到的bug

    从svn1.0升级到svn10.x时发生的bug 1.可能是没有javahl这个架包或是与你升级后的svn版本不匹配,eclipse在线下载就好 2.项目因为之前连接是较低版本的svn,当svn升级后 ...

  10. cocos2d-x-3.1.1 创建项目

    cocos new 项目名  -p 包名 -l  语言 -d 路径 cmd 输入以下命令 cocos new HelloLua -p com.wcc.hellolua -l lua -d E:\coc ...