自定义View的封装

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

MainActivity.java

 1 package com.example.myview;
 2
 3 import android.os.Bundle;
 4 import android.app.Activity;
 5 import android.view.Menu;
 6
 7 public class MainActivity extends Activity {
 8
 9     @Override
10     protected void onCreate(Bundle savedInstanceState) {
11         super.onCreate(savedInstanceState);
12         setContentView(R.layout.activity_main);
13         //setContentView(new Myview(this));
14     }
15 }

activity_main.xml

 1 <FrameLayout 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=".MainActivity" >
 6     <com.example.myview.SubClass
 7         android:layout_width="match_parent"
 8         android:layout_height="match_parent"
 9          />
10 </FrameLayout>

封装后的TestClass.java

 1 package com.example.myview;
 2
 3 import java.util.Random;
 4
 5 import android.content.Context;
 6 import android.graphics.Canvas;
 7 import android.graphics.Paint;
 8 import android.graphics.RectF;
 9 import android.util.AttributeSet;
10 import android.view.View;
11
12 public abstract class TestClass extends View{
13
14     private MyThread thread;
15
16     public TestClass(Context context, AttributeSet attrs) {
17         super(context, attrs);
18     }
19
20     public TestClass(Context context) {
21         super(context);
22     }
23
24     protected abstract void drawSub(Canvas canvas);
25     protected abstract void logic();
26
27     protected void onDraw(Canvas canvas){
28         if(thread==null){
29             thread = new MyThread();
30             thread.start();
31         }else{
32             drawSub(canvas);
33         }
34     }
35
36
37     class MyThread extends Thread{
38         @Override
39         public void run() {
40             while(true){
41                 logic();
42                 postInvalidate();
43                 try {
44                     Thread.sleep(30);
45                 } catch (InterruptedException e) {
46                     e.printStackTrace();
47                 }
48             }
49
50         }
51     }
52
53 }

SubClass.java :继承自TestClass.java

 1 package com.example.myview;
 2
 3 import java.util.Random;
 4
 5 import android.content.Context;
 6 import android.graphics.Canvas;
 7 import android.graphics.Paint;
 8 import android.graphics.RectF;
 9 import android.util.AttributeSet;
10
11
12 public class SubClass extends TestClass{
13
14     private Paint paint = new Paint();
15     private float rx = 0;
16     private RectF rectF = new RectF(0,60,100,160);
17     private float sweepAngel = 0;
18     Random rand = new Random();
19
20     public SubClass(Context context) {
21         super(context);
22     }
23
24     public SubClass(Context context, AttributeSet attrs) {
25         super(context, attrs);
26     }
27
28     @Override
29     protected void drawSub(Canvas canvas) {
30         paint.setTextSize(30);
31         canvas.drawText("LogicView", rx, 30, paint);
32
33         canvas.drawArc(rectF,0,sweepAngel,true,paint);
34     }
35
36     @Override
37     protected void logic() {
38         rx++;
39         if(rx > getWidth()){
40             rx = 0 - paint.measureText("LogicView");
41         }
42
43         sweepAngel ++ ;
44
45         if(sweepAngel > 360){
46             sweepAngel = 0;
47         }
48         int r = rand.nextInt(256);
49         int g = rand.nextInt(256);
50         int b = rand.nextInt(256);
51         paint.setARGB(255, r, g, b);
52     }
53
54 }

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

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

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

时间: 2024-12-27 22:25:41

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

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

1.新建一个继承UIView的自定义view,假设类名叫做 MyAppVew #import <UIKit/UIKit.h> @class MyApp; @interface MyAppView : UIView @property(strong,nonatomic) MyApp*app; +(instancetype)appView; @end MyAppView.h #import "MyAppView.h" #import "MyApp.h" @i

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

1> 新建一个AppView.xib文件来描述AppView内部的结构 2> 新建一个继承UIView的自定义view,假设类名叫做(appView) 3> 修改UIView的类型为appView真实类型 4> 将内部的子控件跟appView进行属性连线 5> appView提供一个模型属性 6> 重写模型属性的set方法,因为在set方法中可以拿到外界控制器传递的模型数据 7> 把模型数据拆开,分别设置数据到对应的子控件中 8> 补充:提供一个创AppVi

自定义View 篇三 《手动打造ViewPage》

有了之前自定义View的理论基础,有了ViewPage.事件分发机制.滑动冲突.Scroller使用等相关知识的铺垫,今天纯手动打造一款ViewPage. 1.完成基本的显示: 在MainActivity中: public class MainActivity extends AppCompatActivity { private MyViewPage mViewPage; int[] imageIds = new int[]{ R.drawable.pic_0, R.drawable.pic_

iOS开发——笔记篇&amp;关于字典plist读取/字典转模型/自定义View/MVC/Xib的使用/MJExtension使用总结

关于字典plist读取/字典转模型/自定义View/MVC/Xib的使用/MJExtension使用总结 一:Plist读取 1 /******************************************************************************/ 2 一:简单plist读取 3 4 1:定义一个数组用来保存读取出来的plist数据 5 @property (nonatomic, strong) NSArray *shops; 6 7 2:使用懒加载的方

自定义View系列教程01--常用工具介绍

在自定义View的时候,常常会用到一些Android系统提供的工具.这些工具封装了我们经常会用到的方法,比如拖拽View,计算滑动速度,View的滚动,手势处理等等.如果我们自己去实现这些方法会比较繁琐,而且容易出一些bug.所以,作为自定义View系列教程的开端,先介绍一下这些常用的工具,以便在后续的学习和工作中使用. Configuration ViewConfiguration GestureDetector VelocityTracker Scroller ViewDragHelper

自定义View(五),onLayout

转自http://blog.csdn.net/a396901990/article/details/38129669 简介: 在自定义view的时候,其实很简单,只需要知道3步骤: 1.测量——onMeasure():决定View的大小 2.布局——onLayout():决定View在ViewGroup中的位置 3.绘制——onDraw():如何绘制这个View. 而第3步的onDraw系统已经封装的很好了,基本不用我们来操心,只需要专注到1,2两个步骤就中好了. 第一步的测量,可以参考我之前的

UI--从学习styleable自定义view属性到一点儿更有意思的尝试

<代码里的世界> -UI篇 用文字札记描绘自己 android学习之路 转载请保留出处 by Qiao http://blog.csdn.net/qiaoidea/article/details/45599593 [导航] - 多行文本折叠展开 自定义布局View实现多行文本折叠和展开 1.概述 前面封装view的时候用到了自定义属性,觉得有必要单独讲一下这部分,但是呢,又不想向其他文章一样千篇一律地写这些东西.所以呢,后便会加一些临时的发散思维,引用点有意思的东西.分享东西嘛,随性点儿. 回

Android自定义View(一、初体验自定义TextView)

转载请标明出处: http://blog.csdn.net/xmxkf/article/details/51454685 本文出自:[openXu的博客] 目录: 继承View重写onDraw方法 自定义属性 onMeasure方法 MeasureSpec 分析为什么我们自定义的MyTextView设置了wrap_content却填充屏幕 重写onMeasure方法 自动换行 源码下载 对于一个Android攻城狮来说,自定义控件是一项必须掌握的重要技能点,然而对于大部分人而言,感觉自定义控件并

Android初级教程初谈自定义view自定义属性

有些时候,自己要在布局文件中重复书写大量的代码来定义一个布局.这是最基本的使用,当然要掌握:但是有些场景都去对应的布局里面写对应的属性,就显得很无力.会发现,系统自带的控件无法满足我们的要求,这个时候就要考虑自定义控件.自定义view的世界,也很浩瀚,个人需要学的地方还有很多很多.自定义view,会节省开发效率,很有必要学习其基本原理和方法.接下来就对自定义view,做一个初步的认识,一步步了解封装的重要性.但是,也仅仅是一个初步,因为它实在太灵活了. 有这么一种场景,看图: 除了布局之外,还有