Android自定义View过程解析

Android自定义的view,主要是继承view,然后实现ondraw这个方法,来进行绘制。

  • 1. 编写自己的自定义view
  • 2. 加入逻辑线程
  • 3. 提取和封装自定义view
  • 4. 利用xml中定义样式来影响显示效果

一、编写自定义的view
1.在xml中使用自己的view

 <!-- 可以使用view的公共属性,例如背景 -->
 <com.niuli.view.MyView
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:background="#ffff00"
  />

2.通过继承view,然后实现ondraw来实现方法

public class MyView extends View {

 Bitmap bitmap;

 public MyView(Context context) {
  super(context);
  /**
   * getResources()可以获取当前资源内的资源
   */
  bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher);
 }

 public MyView(Context context, AttributeSet attrs) {
  super(context, attrs);
  bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher);
 }
 /**
  * 绘制是通过Canvas来承载,其就相当于一块画布
  * 更多的学习将在不断的做小东西中更新
  */
 @Override
 protected void onDraw(Canvas canvas) {
  super.onDraw(canvas);
  /**
   * Paint相当于一只画笔,可以画文字,几何图形,bit图片等
   */
  Paint paint = new Paint();
  //设置绘制的颜色,是否空心之类的都是对画笔的设计
  paint.setColor(Color.BLUE);

  //绘画文字
  paint.setTextSize(30);
  canvas.drawText("这是一个自定义view", 0, 30, paint);
  //绘画直线
  canvas.drawLine(0, 60, 100, 60, paint);
  //绘画圆角矩形方法之一
  //设置空心
  paint.setStyle(paint.getStyle().STROKE);

  RectF rec = new RectF(0, 90, 100, 190);
  canvas.drawRoundRect(rec, 20, 20, paint);
  //绘制图片
  canvas.drawBitmap(bitmap, 0, 350, paint);
 }

}

效果

二、自定义的view+线程的使用控制
绘制文字,和圆形,通过线程控制使得其能在屏幕中移动

public class MyViewtwo extends View {

 //定义画笔
 private Paint paint = new Paint();
 private int x;
 private float sweepAngle;
 private control thread;
 private Random random = new Random();

 public MyViewtwo(Context context, AttributeSet attrs) {
  super(context, attrs);
 }

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

 @Override
 protected void onDraw(Canvas canvas) {
  paint.setTextSize(80);
  //绘制文字
  canvas.drawText("七夕快乐", x, 70, paint);
  //绘制图形
  RectF rect = new RectF(0 ,80 ,100, 160);
  canvas.drawArc(rect, 0, sweepAngle, true, paint);

  //启动线程
  if (thread ==null) {
   thread = new control();
   thread.start();
  }
 }
 public class control extends Thread{
  @Override
  public void run() {
   while(true){
    x +=3;
    sweepAngle++;
    if (x>getWidth()) {
     x = (int) (0 - paint.measureText("七夕快乐"));
    }
    //控制圆的的旋转
    if (sweepAngle>360) {
     sweepAngle = 0;
    }
    //设置画笔颜色
    paint.setARGB(255, random.nextInt(255), random.nextInt(255), random.nextInt(255));

    //相当于刷新画布
    postInvalidate();

    try {
     sleep(30);
    } catch (InterruptedException e) {
     e.printStackTrace();
    }
   }
  }
 }

效果

三、封装移动程序,模块化思想
封装主要是使用抽象方法,子类继承后只要实现这些方法即可运行起来,大大简化了程序

public abstract class MyViewtwo extends View {

 private control thread;

 public MyViewtwo(Context context, AttributeSet attrs) {
  super(context, attrs);
 }

 public MyViewtwo(Context context) {
  super(context);
 }
 //封装,构造画面,子类继承后需要重写
 protected abstract void drawsub(Canvas canvas);

 @Override
 protected final void onDraw(Canvas canvas) {

  //启动线程
  if (thread ==null) {
   thread = new control();
   thread.start();
  }else {
   drawsub(canvas);
  }
 }
 //封装移动方法,子类继承后需要重写
 protected abstract void move();

 public class control extends Thread{
  @Override
  public void run() {
   while(true){
    move();
    //相当于刷新画布
    postInvalidate();

    try {
     sleep(30);
    } catch (InterruptedException e) {
     e.printStackTrace();
    }
   }
  }
 }

}

四、使用xml中定义样式影响显示效果
1、第一步就是在value文件夹中建立自己的样式文件

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

2、xml中先要加入命名空间,然后就可以直接使用属性

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
 xmlns:tools="http://schemas.android.com/tools"
 xmlns:nt="http://schemas.android.com/apk/res/com.jikexueyuan.myview"
 android:id="@+id/container"
 android:layout_width="match_parent"
 android:layout_height="match_parent" >

 <com.jikexueyuan.myview.v4.NumText
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  nt:lineNum="6"
  nt:xScroll="true"/>

</FrameLayout>

3、代码中要有相应的解析xml中定义的这个元素

public NumText(Context context, AttributeSet attrs) {
  super(context, attrs);

  TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.NumText);
  lineNum = ta.getInt(R.styleable.NumText_lineNum, 1);
  xScroll = ta.getBoolean(R.styleable.NumText_xScroll, false);
  ta.recycle();
 }

主要就是利用以上方法和xml中定义元素值进行曝光相关联。

以上就是本文的全部内容,希望对大家的学习有所帮助。

(0)

相关推荐

  • Android自定义view制作绚丽的验证码

    废话不多说了,先给大家展示下自定义view效果图,如果大家觉得还不错的话,请继续往下阅读. 怎么样,这种验证码是不是很常见呢,下面我们就自己动手实现这种效果,自己动手,丰衣足食,哈哈~ 一. 自定义view的步骤 自定义view一直被认为android进阶通向高手的必经之路,其实自定义view好简单,自定义view真正难的是如何绘制出高难度的图形,这需要有好的数学功底(后悔没有好好学数学了~),因为绘制图形经常要计算坐标点及类似的几何变换等等.自定义view通常只需要以下几个步骤: 写一个类继承

  • Android自定义View实现水面上涨效果

    实现效果如下: 实现思路: 1.如何实现圆中水面上涨效果:利用Paint的setXfermode属性为PorterDuff.Mode.SRC_IN画出进度所在的矩形与圆的交集实现 2.如何水波纹效果:利用贝塞尔曲线,动态改变波峰值,实现"随着进度的增加,水波纹逐渐变小的效果" 话不多说,看代码. 首先是自定义属性值,有哪些可自定义属性值呢? 圆的背景颜色:circle_color,进度的颜色:progress_color,进度显示文字的颜色:text_color,进度文字的大小:tex

  • Android自定义View实现广告信息上下滚动效果

    先看看效果: 实现代码: public class ScrollBanner extends LinearLayout { private TextView mBannerTV1; private TextView mBannerTV2; private Handler handler; private boolean isShow; private int startY1, endY1, startY2, endY2; private Runnable runnable; private Li

  • Android自定义View之酷炫圆环(二)

    先看下最终的效果 静态: 动态: 一.开始实现 新建一个DoughnutProgress继承View public class DoughnutProgress extends View { } 先给出一些常量.变量以及公共方法的代码,方便理解后面的代码 private static final int DEFAULT_MIN_WIDTH = 400; //View默认最小宽度 private static final int RED = 230, GREEN = 85, BLUE = 35;

  • Android自定义View软键盘实现搜索

    1. xml文件中加入自定义 搜索view <com.etoury.etoury.ui.view.IconCenterEditText android:id="@+id/search_et" style="@style/StyleEditText" android:hint="搜索景点信息" /> 2. 自定义的   view java文件 IconCenterEditText.java package com.etoury.etou

  • Android自定义View实现带数字的进度条实例代码

    第一步.效果展示 图1.蓝色的进度条 图2.红色的进度条 图3.多条颜色不同的进度条 图4.多条颜色不同的进度条 第二步.自定义ProgressBar实现带数字的进度条 0.项目结构 如上图所示:library项目为自定义的带数字的进度条NumberProgressBar的具体实现,demo项目为示例项目以工程依赖的方式引用library项目,然后使用自定义的带数字的进度条NumberProgressBar来做展示 如上图所示:自定义的带数字的进度条的library项目的结构图 如上图所示:de

  • Android自定义View之酷炫数字圆环

    先看下最终的效果 一.开始实现 新建一个DoughnutView继承View public class DoughnutView extends View { } 先重写onMeasure方法. /** * 当布局为wrap_content时设置默认长宽 * * @param widthMeasureSpec * @param heightMeasureSpec */ @Override protected void onMeasure(int widthMeasureSpec, int hei

  • 实例讲解Android中的View类以及自定义View控件的方法

    View的简单理解和实例 1.View的基本概念 在Activity显示的控件 都叫做View(View类 是所有的控件类的父类  比如 文本 按钮) 2.在Activity当中获取代表View的对象 Activity读取布局文件生成相对应的 各种View对象 TextView textView=(TextView)findViewBy(R.id.textView) 3.设置view的属性 Activity_mian.xml 这样的xml布局文件中发现了,类似@+id/和@id/到底有什么区别呢

  • Android自定义View设定到FrameLayout布局中实现多组件显示的方法 分享

    如果想在自定义的View上面显示Button 等View组件需要完成如下任务 1.在自定义View的类中覆盖父类的构造(注意是2个参数的) 复制代码 代码如下: public class MyView2 extends View{ public MyView2(Context context,AttributeSet att) {super(context,att); } public void onDraw(Canvas c) { // 这里绘制你要的内容 } } 2.定义布局文件 复制代码

  • Android 自定义View的使用介绍

    在项目开发中,可能系统自带的一些widget不能满足我们的需求,这时就需要自定义View. 通过查看系统中的常用widget如Button,TextView,EditText,他们都继承自View,所以我们在继承自定义View的时候也自然的需要继承View.1.首先新建一个类LView继承自View 复制代码 代码如下: public class LView extends View { private Paint paint; public LView(Context context) {  

随机推荐