自定义View(二)——入门继承View的实例

1.实例建造过程

1)BaseView(抽象类)

package com.myview.v3;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.RectF;
import android.util.AttributeSet;
import android.view.View;

/**
 * Created by 刘鹏达 on 2017/10/15.
 */

/*
图形的变化一定是使用了线程不断的变化显示的内容,那么为了实现这个效果,通常会把改变属性设置为成员变量,
然后在内部线程类中去改变,并且把改变的属性调用其他方法从而显示。接下来,我们进行抽离和封装

抽离:
核心就是将显示方法和线程变动的参数抽离出来。

封装就是:将这些方法抽离出来封装到一个类中,从而实现

 */
public abstract class  BaseView extends View{

    private MyThread thread;

    public BaseView(Context context, AttributeSet attributeSet){
        super(context,attributeSet);
    }

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

    protected void onDraw(Canvas canvas){
        if(thread==null){
            thread=new MyThread();
            thread.start();
        }else {
            drawSub(canvas);
        }
    }

    class MyThread extends Thread{
        public void run(){
            while(true){
                logic();
                postInvalidate();//刷新的方法,刷新之后调用OnDraw()方法
                try{
                    Thread.sleep(30);
                }catch (InterruptedException e){
                    e.printStackTrace();
                }

            }
        }
    }
    protected abstract void drawSub(Canvas canvas);
    protected abstract void logic();

}

2)书写自定义view的属性(在res文件夹的values文件夹里面建一个attrs.xml文件,其一般会在自定义view中的布局构造方法也就是两个参数的构造方法中被解析引用)

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <declare-styleable name="NumText">
        <attr name="LineNum" format="integer"></attr>
        <attr name="b" format="boolean"/>
    </declare-styleable>
</resources>

3)NumText(自定义view类)

package com.myview.v4;

import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.util.AttributeSet;

import com.example.myview.R;
import com.myview.v3.BaseView;

/**
 * Created by 刘鹏达 on 2017/10/15.
 */
public class NumText extends BaseView {
   Paint paint=new Paint();
    int lineNum=0;
    float x=0;
    boolean b=false;
    public NumText(Context context, AttributeSet attributeSet){
        super(context,attributeSet);
        TypedArray ta=context.obtainStyledAttributes(attributeSet, R.styleable.NumText);
        lineNum=ta.getInt(R.styleable.NumText_LineNum,1);
        b=ta.getBoolean(R.styleable.NumText_b,false);
        ta.recycle();
    }

    public NumText(Context context){
        super(context);
    }
    @Override
    protected void drawSub(Canvas canvas) {
      for(int i=0;i<lineNum;i++){
          int textSize=30+i;
          paint.setTextSize(textSize);
          canvas.drawText("极客学院",x,textSize+textSize*i,paint);
      }
    }

    @Override
    protected void logic() {
        x+=3;
        if(x>getWidth()){
            x=-paint.measureText("极客学院");
        }
    }
}

4)引用自定义view

布局:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:nt="http://schemas.android.com/apk/res-auto"
    android:orientation="vertical"
    android:layout_height="match_parent"
    android:layout_width="match_parent">
   <com.myview.v4.NumText
       nt:LineNum="3"
       nt:b="true"
       android:layout_width="match_parent"
       android:layout_height="wrap_content" />

</LinearLayout>

activity:

package com.example.myview;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

import com.myview.v3.LoginView;
import com.myview.v3.MyText;
import com.myview.v4.NumText;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //setContentView(new MyView(this);这个方法也可以实现显示自定义组件,其是利用了自定义组件的组件构造函数
    }
}
总结:1.自定义组件常见步骤:1)写好该组件继承view或者其他组件2)写好两个构造函数,一个用于布局(一般这边会用来解析属性文件),一个用于组件(当然还有三个参数的构造方法,这边先跳过)3)写好onDraw()方法进行绘字,绘线,绘图4)在布局文件中引入该布局,记住包名要写上,或者直接在Java中引用我们的组件

2.使用线程的组件核心:用于该组件的是动态图。具体步骤为:1)写好BaseView,里面有两个方法抽象,分别是显示方法和改变参数方法而在线程中直接调用这两个方法再重新调用ondraw()方法,而在ondraw()方法中如果线程为空,那么实例化线程,并且启动,如果不为空,直接调用显示方法2)写一个组件继承BaseView并且实现这两个抽象方法3)在布局文件中引入该组件,并且显示

3.自定义属性并且使用1)先建立一个attr.xml的自定义属性文件2)设置命名空间(空间名为项目名,也就是manifest中的包名),然后根据这个空间引用属性并且赋值。3)解析得到这个属性,并且利用,一般解析是在构造方法中
时间: 2024-10-07 10:20:37

自定义View(二)——入门继承View的实例的相关文章

android自定义控件(二) 入门,继承View

转载请注明地址:http://blog.csdn.net/ethan_xue/article/details/7313788 ps: 可根据apidemo里LableView,list4,list6学习 文档在dev guide/Framework Topics/User Interface/Building Custom Components 自定义控件的步骤: 1 View的工作原理  2 编写View类  3 为View类增加属性  4 绘制屏幕  5 响应用户消息  6 自定义回调函数

自定义View 一 (继承VIew重写onDraw方法)

项目:具有圆形效果的自定义View 一.继承View并重写onDraw方法 public class CircleView extends View{ private static final int COLOR = Color.RED; private Paint mPaint = new Paint(Paint.ANTI_ALIAS_FLAG); private int mWidth = 0; private int mHeight = 0; public CircleView(Contex

自定义View(二)--继承自ViewGroup

自定义View包括很多种,上一次随笔中的那一种是完全继承自View,这次写的这个小Demo是继承自ViewGroup的,主要是将自定义View继承自ViewGroup的这个流程来梳理一下,这次的Demo中自定义了一个布局的效果,并且这个自定义布局中包含布局自己的属性,布局中的控件也包含只属于这个布局才具有的自定义属性(类似于layout_weight只存在于LinearLayout中,只有LinearLayout中的控件可以使用一样).话不多说,先看效果图: 其中红色的部分是自定义的ViewGr

自定义View(三)——继承ViewGroup实例

1.案例打造过程 1)建立该组件的布局(title.xml) <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal" android:layout_width="mat

自定义View(二)(Android群英传)

内容是博主照着书敲出来的,博主码字挺辛苦的,转载请注明出处,后序内容陆续会码出. 上一篇自定义View(一)(Android群英传)中说的是对现有控件进行拓展,这篇介绍第二种自定义View方法,创建复合控件. 创建复合控件 创建复合控件可以很好地创建出具有重用功能的控件集合.这种方式通常需要继承一个合适的ViewGroup,再给它添加指定功能的控件,从而组合成新的复合控件.通过这种方式创建的控件,我们一般会给它指定一些可配置的属性,让它具有更强的拓展性.下面就以一个TopBar为示例,讲解如何创

自定义控件之直接继承View创建全新视图(二)

自定义控件我们上一节探讨了一种最简单的自定义是直接继承View的子类,实现控件的不同UI视图展示及功能的拓展,在学习新知识前可以温习下之前所学知识-自定义控件之对现有控件拓展(一). ok,在回顾了之前所学的知识之后,现在我们来学习稍微复杂点的自定义控件:今天我们实现一个直接继承于View的全新控件.大家都知道音乐播放器吧,在点击一首歌进行播放时,通常会有一块区域用于显示音频条,我们今天就来学习下,播放器音频条的实现. 首先我们还是先定义一个类,直接继承于View,并重写它的构造方法,并初始化一

自定义控件---继承View类方式(自定义开关效果案例)

----------------------------------------------------简单的效果图-------------------------------------------------------------------------- activity_main.xml <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools=&quo

自定义View(二),强大的Canvas

本文转自:http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2012/1212/703.html Android中使用图形处理引擎,2D部分是android SDK内部自己提供,3D部分是用Open GL ES 1.0.今天我们主要要了解的是2D相关的,如果你想看3D的话那么可以跳过这篇文章. 大部分2D使用的api都在android.graphics和android.graphics.drawable包中.他们提供了图形处理相关的: C

Android 深入了解View(二)

相信每个Android程序员都知道,我们每天的开发工作当中都在不停地跟View打交道,Android中的任何一个布局.任何一个控件其实都是直接或间接继承自View的,如TextView.Button.ImageView.ListView等.这些控件虽然是Android系统本身就提供好的,我们只需要拿过来使用就可以了,但你知道它们是怎样被绘制到屏幕上的吗?多知道一些总是没有坏处的,那么我们赶快进入到本篇文章的正题内容吧. 要知道,任何一个视图都不可能凭空突然出现在屏幕上,它们都是要经过非常科学的绘