通过上一个博文的自定义View的编写后,发现代码其实挺复杂的,所有这里通过对代码进一步的优化,即用到了java的一个重要的特点:封装。通过对父类的方法进行封装,然后在子类继承后实现相应的函数即可,达到了代码的优化。

MainActivity.java

 package com.example.myview;

 import android.os.Bundle;
import android.app.Activity;
import android.view.Menu; public class MainActivity extends Activity { @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//setContentView(new Myview(this));
}
}

activity_main.xml

 <FrameLayout 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"
tools:context=".MainActivity" >
<com.example.myview.SubClass
android:layout_width="match_parent"
android:layout_height="match_parent"
/>
</FrameLayout>

封装后的TestClass.java

 package com.example.myview;

 import java.util.Random;

 import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.RectF;
import android.util.AttributeSet;
import android.view.View; public abstract class TestClass extends View{ private MyThread thread; public TestClass(Context context, AttributeSet attrs) {
super(context, attrs);
} public TestClass(Context context) {
super(context);
} protected abstract void drawSub(Canvas canvas);
protected abstract void logic(); protected void onDraw(Canvas canvas){
if(thread==null){
thread = new MyThread();
thread.start();
}else{
drawSub(canvas);
}
} class MyThread extends Thread{
@Override
public void run() {
while(true){
logic();
postInvalidate();
try {
Thread.sleep();
} catch (InterruptedException e) {
e.printStackTrace();
}
} }
} }

SubClass.java :继承自TestClass.java

 package com.example.myview;

 import java.util.Random;

 import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.RectF;
import android.util.AttributeSet; public class SubClass extends TestClass{ private Paint paint = new Paint();
private float rx = ;
private RectF rectF = new RectF(,,,);
private float sweepAngel = ;
Random rand = new Random(); public SubClass(Context context) {
super(context);
} public SubClass(Context context, AttributeSet attrs) {
super(context, attrs);
} @Override
protected void drawSub(Canvas canvas) {
paint.setTextSize();
canvas.drawText("LogicView", rx, , paint); canvas.drawArc(rectF,,sweepAngel,true,paint);
} @Override
protected void logic() {
rx++;
if(rx > getWidth()){
rx = - paint.measureText("LogicView");
} sweepAngel ++ ; if(sweepAngel > ){
sweepAngel = ;
}
int r = rand.nextInt();
int g = rand.nextInt();
int b = rand.nextInt();
paint.setARGB(, r, g, b);
} }

通过运行达到了一样的效果。

但是有些人会说,这样写的话不是更加复杂,而且代码增多了?

其实不然,通过对父类TestClass.java进行封装后,我们所要做的工作其实只有SubClass.java(继承自父类TestClass.java),然后实现类中的2个方法protected void drawSub(Canvas canvas)和protected void logic()即可,而线程的实现已经在父类TestClass.java中实现了,而不用再实现。当工作量很大的时候,这是相当有利的。

自定义View的封装的更多相关文章

  1. iOS回顾笔记(03) -- 自定义View的封装和xib文件的使用详解

    iOS回顾笔记(03) -- 自定义View的封装和xib文件的使用详解 iOS开发中,我们常常将一块View封装起来,以便于统一管理内部的子控件.如iOS回顾笔记(02)中的"书" ...

  2. 使用xib封装一个自定义view的步骤

    使用xib封装一个自定义view的步骤 1> 新建一个继承UIView的自定义view,假设类名叫做(MJAppView) 2> 新建一个MJAppView.xib文件来描述MJAppVi ...

  3. IOS中使用.xib文件封装一个自定义View

    1.新建一个继承UIView的自定义view,假设类名叫做 MyAppVew #import <UIKit/UIKit.h> @class MyApp; @interface MyAppV ...

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

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

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

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

  6. Dialog详解(包括进度条、PopupWindow、自定义view、自定义样式的对话框)

    Dialog详解(包括进度条.PopupWindow.自定义view.自定义样式的对话框)   Android中提供了多种对话框,在实际应用中我们可能会需要修改这些已有的对话框.本实例就是从实际出发, ...

  7. Android 自定义 view(四)—— onMeasure 方法理解

    前言: 前面我们已经学过<Android 自定义 view(三)-- onDraw 方法理解>,那么接下我们还需要继续去理解自定义view里面的onMeasure 方法 推荐文章: htt ...

  8. 分析自定义view的实现过程-实现雪花飞舞效果(转载有改动)

    声明:本文源码出自实现雪花飞舞效果(有改动)主要通过这篇文来分析自定义view的实现过程. 没事时,比较喜欢上网看看一些新的东西,泡在网上的日子就是一个很不错的网站. 下面开始了,哈哈.^_^ 大家都 ...

  9. Android 自定义View及其在布局文件中的使用示例(三):结合Android 4.4.2_r1源码分析onMeasure过程

    转载请注明出处 http://www.cnblogs.com/crashmaker/p/3549365.html From crash_coder linguowu linguowu0622@gami ...

随机推荐

  1. python字符集选择

    # coding=utf8 或者 # -*- coding:utf-8 -*- 在python2 中默认是ASCII码的字符集,但可以引入其他的字符集  这个需要在头信息中引入: 而在python3中 ...

  2. 在iOS上present一个半透明的viewController

    UIViewController *viewController = [[UIViewController alloc]init]; UIViewController* controller = se ...

  3. Spark Streaming--实战篇

    摘要:      Sprak Streaming属于Saprk API的扩展,支持实时数据流(live data streams)的可扩展,高吞吐(hight-throughput) 容错(fault ...

  4. Exchange Server 2010升级到Exchange Server 2013概览

  5. 跟我学系列教程——《13天让你学会Redis》火热报名中

    学习目标 每天2小时,13天让你学会Redis. 本课程针对Redis新手,甚至连Redis是什么都没有听说过的同学.课程会具体介绍Redis是什么以及为什么要使用Redis,结合项目实践旨在让学生从 ...

  6. vim的正则表达式(二)应用实例

    本文出自   http://blog.csdn.net/shuangde800 ------------------------------------------------------------ ...

  7. [spring入门学习笔记][spring的IoC原理]

    什么叫IoC 控制反转(Inversion of Control,缩写为IoC),是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度.其中最常见的方式叫做依赖注入(Dependency ...

  8. Android --------- 标签include位置设置无效

    给include设置below或align无效,是因为没有给include设置width和height.

  9. Android-------手机屏幕适配之文件适配

    public class Main {         //定义文件本地存储路径,可按照需求更改         private final static String rootPath = &quo ...

  10. 1203.4——循环语句 之 for

    for循环的一般形式为:for(表达式1; 表达式2; 表达式3){    语句块} 它的执行过程如下:1) 先求解表达式1. 2) 求解表达式2,若其值为真(非0),则执行循环体,否则结束循环. 3 ...