布局文件:

  1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2. xmlns:tools="http://schemas.android.com/tools"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent"
  5. tools:context=".CustomViewActivity"
  6. android:id="@+id/root"
  7. android:orientation="vertical">
  8. </LinearLayout>

自定义类:

这个类必须写在一个独立的java文件中

  1. public class DrawView extends View
  2. {
  3. public float currentX = 40;
  4. public float currentY = 50;
  5. // 定义、并创建画笔
  6. Paint p = new Paint();
  7. public DrawView(Context context)
  8. {
  9. super(context);
  10. }
  11. public DrawView(Context context , AttributeSet set)
  12. {
  13. super(context,set);
  14. }
  15. @Override
  16. public void onDraw(Canvas canvas)
  17. {
  18. super.onDraw(canvas);
  19. // 设置画笔的颜色
  20. p.setColor(Color.RED);
  21. // 绘制一个小圆(作为小球)
  22. canvas.drawCircle(currentX, currentY, 15, p);
  23. }
  24. // 为该组件的触碰事件重写事件处理方法
  25. @Override
  26. public boolean onTouchEvent(MotionEvent event)
  27. {
  28. // 修改currentX、currentY两个属性
  29. currentX = event.getX();
  30. currentY = event.getY();
  31. // 通知当前组件重绘自己
  32. invalidate();
  33. // 返回true表明该处理方法已经处理该事件
  34. return true;
  35. }
  36. }

将组件添加到容器中去

  1. public class MainActivity extends AppCompatActivity {
  2.  
  3. @Override
  4. protected void onCreate(Bundle savedInstanceState) {
  5. super.onCreate(savedInstanceState);
  6. setContentView(R.layout.activity_main);
  7.  
  8. LinearLayout root=(LinearLayout) findViewById(R.id.root);
  9. final myDrawView draw=new myDrawView(this);
  10. draw.setMinimumWidth(300);
  11. draw.setMinimumHeight(500);
  12. root.addView(draw);
  13. }
  14. }

也可以在布局文件里加载自定义的组件。把布局文件修改如下:

Android studio在写布局文件的时候,代码补全可以侦测到自定义组件的名字,确实很智能。

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. xmlns:tools="http://schemas.android.com/tools"
  4. android:layout_width="match_parent"
  5. android:layout_height="match_parent"
  6. tools:context="myDrawView"
  7. android:id="@+id/root"
  8. android:orientation="vertical">
  9.  
  10. <allegro.mydrawview.myDrawView
  11. android:layout_width="match_parent"
  12. android:layout_height="match_parent" />
  13. </LinearLayout>

这样在java代码中不必要额外写代码加载自定义的组件了。下面的代码已经注释了加载组件的代码。

  1. public class MainActivity extends AppCompatActivity {
  2.  
  3. @Override
  4. protected void onCreate(Bundle savedInstanceState) {
  5. super.onCreate(savedInstanceState);
  6. setContentView(R.layout.activity_main);
  7.  
  8. /*LinearLayout root=(LinearLayout) findViewById(R.id.root);
  9. final myDrawView draw=new myDrawView(this);
  10. draw.setMinimumWidth(300);
  11. draw.setMinimumHeight(500);
  12. root.addView(draw);*/
  13. }
  14. }

这个程序的效果是,随手指移动的小球。

Android学习:自定义组件,DrawView的更多相关文章

  1. Android学习----自定义Adapter实现ListView

    前言: 对于ListView而言,自定义的Adapter对于显示复杂的界面有很大的灵活性 .使用自定义的Adapter需要继承BaseAdapter,然后重写getCount(),getView(), ...

  2. Android学习自定义Dialog

    Dialog是Android提供的各种对话框的基类,和上篇的DialogFragment类似.为什么还要介绍Dialog呢,因为DialogFragment只能运行在Android3.0以上的系统中. ...

  3. Android学习笔记 Toast屏幕提示组件的使用方法

    activity_main.xml <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android&qu ...

  4. 【转】Android学习基础自定义Checkbox组件

    原文网址:http://forum.maiziedu.com/thread-515-1-1.html heckbox组件是一种可同时选中多项的基础控件,即复选框,在android学习中,Checkbo ...

  5. android学习日记20--连接组件之Intent和IntentFilter

    上次刚了解完Android的四大组件,现在学习组件间通信的Intent和IntentFilter 一.Intent 1.简述 Intent(意图)在应用程序运行时连接两个不同组件,是一种运行时的绑定机 ...

  6. Android之自定义View学习(一)

    Android之自定义View学习(一) Canvas常用方法: 图片来源 /** * Created by SiberiaDante on 2017/6/3. */ public class Bas ...

  7. Android学习系列(3)--App自动更新之自定义进度视图和内部存储

    友好的视觉感知和稳定的不出错表现,来自于我们追求美感和考虑的全面性,博客园从技术的角度,一直我都很欣赏.这篇文章是android开发人员的必备知识,是我特别为大家整理和总结的,不求完美,但是有用. 这 ...

  8. 【转】 Pro Android学习笔记(六五):安全和权限(2):权限和自定义权限

    目录(?)[-] 进程边界 声明和使用权限 AndroidManifestxml的许可设置 自定义权限 运行安全通过两个层面进行保护.进程层面:不同应用运行在不同的进程,每个应用有独自的user ID ...

  9. Android自定义组件系列【5】——进阶实践(2)

    上一篇<Android自定义组件系列[5]--进阶实践(1)>中对任老师的<可下拉的PinnedHeaderExpandableListView的实现>前一部分进行了实现,这一 ...

随机推荐

  1. 【转】Java基础:System.out.println与System.err.println的区别

    同时使用了System.out.println与System.err.println()打印输入内容,结果看到的内容和预想的不一样,顺序与预料的不同并不是因为err和out的区别导致,而是因为他们是两 ...

  2. python之property属性

    Property的概念:property是一种特殊的属性,访问它时会执行一段功能(函数),然后返回值. import math class Circle: def __init__(self,radi ...

  3. Vue(五)模板

    模板 1. 简介 Vue.js使用基于HTML的模板语法,可以将DOM绑定到Vue实例中的数据 模板就是{{}},用来进行数据绑定,显示在页面中 也称为Mustache语法 2. 数据绑定的方式 a. ...

  4. Vue(三)常用指令

    (1) v-model 双向数据绑定,一般用于表单元素 <script> window.onload=function(){ new Vue({ // el:'.itany', el:'d ...

  5. pip的基本使用

    pip的基本使用 1.pip简介 pip 是一个现代的,通用的 Python 包管理工具.提供了对 Python 包的查找.下载.安装.卸载的功能 pip是官方推荐的安装和管理Python包的工具,用 ...

  6. 国际化之iPhone设备支持的语种

    有没有想过,iPhone 语言到底支持多少语言呢?我倒是搜索了一下,整理出下面一份列表,供大家参考 参考链接: https://www.ibabbleon.com/iOS-Language-Codes ...

  7. JS对HTML字符的转义

    function htmlEscape(str){ var s = ""; if(str.length == 0) return ""; s = str.rep ...

  8. java-Freemarker TemplateLoader实现模版

    TemplateLoader的实现 作为一个模板文件加载的抽象,自然不能限制模板来自何方,在FreeMarker中由几个主要的实现类来体现,这些TemplateLoader是可以独立使用的,Webap ...

  9. php : 开发记录(2017-03-10)

    0.后台 循环N*10000次操作的简单处理 后台需要循环做N*10000次级别的工作时候,比如,发送邮件,推送通知.可以先把所有数据导入数据表(数据库操作所需的时间1~2秒),然后前台循环发送请求, ...

  10. [转]awsome-java

    原文链接 Awesome Java A curated list of awesome Java frameworks, libraries and software. Contents Projec ...