自定义view,安卓自带的控件的功能效果不能满足需求
自定义view的分类:
自绘控件和重写控件

自绘控件:类继承view,实现listener接口,重写构造方法,重写OnDraw方法,canvas,paint,invalidate方法刷新,在activity的布局中引用

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.os.Build;
import android.support.annotation.RequiresApi;
import android.util.AttributeSet;
import android.view.View;/**
* Created by xiaozhen on 2018/6/15.
*/public class MyView extends View {public MyView(Context context) {
super(context);
}public MyView(Context context, AttributeSet attrs) {
super(context, attrs);
}public MyView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
public MyView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
}@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
Paint paint=new Paint();
paint.setColor(Color.GRAY);
paint.setAntiAlias(true);//设置抗锯齿canvas.drawCircle(getWidth()/2,getHeight()/2,getWidth()/4,paint);
}
}
在activity布局文件中调用:<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_my_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.example.xiaozhen.webapplication.MyViewActivity">
<com.example.xiaozhen.webapplication.MyView
android:id="@+id/myView"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>

2.时钟案例思路
1.得到当前的时分秒Calander对象的使用
2.秒钟一直在不停的走,所以这里要用到线程,又因为子线程不能做耗时操作,所以也要用到handler

将时分秒用画笔画出来,然后绘制时钟的刻度,这里要用到循环因为有60个刻度,下面是在MyviewJava文件中,画出时分秒,并且写一个refrash的方法

package com.example.xiaozhen.webapplication;import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.RectF;
import android.os.Build;
import android.support.annotation.RequiresApi;
import android.util.AttributeSet;
import android.view.View;/*** Created by xiaozhen on 2018/6/15.*/public class MyView extends View {private int Hour=80;private int minute=60;private int second=10;public MyView(Context context) {super(context);}public MyView(Context context, AttributeSet attrs) {super(context, attrs);}public MyView(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);}@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)public MyView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {super(context, attrs, defStyleAttr, defStyleRes);}@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);Paint paint = new Paint();paint.setColor(Color.GRAY);paint.setAntiAlias(true);//设置抗锯齿// canvas.drawCircle(getWidth()/2,getHeight()/2,getWidth()/4,paint);paint.setColor(Color.BLACK);paint.setStrokeWidth(5);Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.clock);//有float类型的RectF rectF = new RectF(getWidth() / 4, getHeight() / 2 - getWidth() / 4, getWidth() / 4 * 3, getHeight() / 2 + getWidth() / 4);canvas.drawBitmap(bitmap, null, rectF, paint);//时canvas.save();            //位置不能换canvas.rotate(Hour * 30 + minute * 30 / 60, getWidth() / 2, getHeight() / 2);canvas.drawLine(getWidth() / 2, getHeight() / 2, getWidth() / 2, getHeight() / 2 - getWidth() / 4 + 170, paint);canvas.restore();//分canvas.save();canvas.rotate(6 * minute, getWidth() / 2, getHeight() / 2);canvas.drawLine(getWidth() / 2, getHeight() / 2, getWidth() / 2, getHeight() / 2 - getWidth() / 4 + 150, paint);canvas.restore();//秒canvas.save();canvas.rotate(6 * second, getWidth() / 2, getHeight() / 2);canvas.drawLine(getWidth() / 2, getHeight() / 2, getWidth() / 2, getHeight() / 2 - getWidth() / 4 + 100, paint);canvas.restore();for (int i = 1; i <= 60; i++) {canvas.save();canvas.rotate(6 * i, getWidth() / 2, getHeight() / 2);if (i % 5 == 0) {paint.setStrokeWidth(6);canvas.drawLine(getWidth() / 2, getHeight() / 2 - getWidth() / 4 + 5, getWidth() / 2, getHeight() / 2 - getWidth() / 4+20, paint);} else {paint.setStrokeWidth(2);canvas.drawLine(getWidth() / 2, getHeight() / 2 - getWidth() / 4 + 5, getWidth() / 2, getHeight() / 2 - getWidth() / 4+10, paint);}canvas.restore();}//paint.setTextSize(30);}public void refrash(int h, int m, int s) {this.Hour = h;this.minute = m;this.second = s;invalidate();}
}

接着在activity中用Calendar 得到当前时间

package com.example.xiaozhen.webapplication;import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;import java.util.Calendar;public class MyViewActivity extends AppCompatActivity {private MyView myView;private int hour;private int minute;private int second;private Handler handler=new Handler(){@Overridepublic void handleMessage(Message msg) {super.handleMessage(msg);//myView.refrash(msg.what,msg.arg1,msg.arg2);}};@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_my_view);myView= (MyView) findViewById(R.id.myView);//得到当前时间Calendar calendar=Calendar.getInstance();hour=calendar.get(Calendar.HOUR_OF_DAY);minute=calendar.get(Calendar.MINUTE);second=calendar.get(Calendar.SECOND);myView.invalidate();new Thread(new Runnable() {@Overridepublic void run() {while (true) {second++;if (second == 60) {second = 0;minute++;}Message message = handler.obtainMessage();message.what = hour;message.arg1 = minute;message.arg2 = second;handler.sendMessage(message);try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}}}).start();}}

自定义view的简单使用相关推荐

  1. 球体动画Android,Android自定义View实现简单炫酷的球体进度球实例代码

    前言 最近一直在研究自定义view,正好项目中有一个根据下载进度来实现球体进度的需求,所以自己写了个进度球,代码非常简单.先看下效果: 效果还是非常不错的. 准备知识 要实现上面的效果我们只要掌握两个 ...

  2. Android自定义View如此简单 实现点击动画+进度刷新的提交/下载按钮(填坑面试题)

    SubmitButton 背景 实现思路 继承View 面试题:构造方法如何选择 自定义属性 面试题:styleable.AttributeSet.TypedArray的关系 测量宽高 面试题:UNS ...

  3. 支付宝芝麻信用页面自定义View的简单制作(续)

    前两个月刚刚写了一篇关于支付宝芝麻信用页面自定义View的总结,感觉写的不太好,链接如下: http://blog.csdn.net/anny_lin/article/details/49474555 ...

  4. Android利用自定义View实现简单的足球战术板

    参考自:http://blog.csdn.net/lmj623565791/article/details/46858663 学习Android初期,之前接触了一些UI设计,突发奇想想要做一个简单的足 ...

  5. android 字体描边实现,Android自定义View实现简单文字描边功能

    本文实例为大家分享了Android实现简单文字描边功能的具体代码,供大家参考,具体内容如下 效果图: 实现代码: package com.example.zhangyu.myview.widget; ...

  6. Android 自定义view完全解析--带你通透了解自定义view

    参考转自郭霖博客带你一步步深入了解View系列 Android LayoutInflater原理分析 相信接触Android久一点的朋友对于LayoutInflater一定不会陌生,都会知道它主要是用 ...

  7. Android自定义View实现三角到八角的属性分布图-雷达图(蜘蛛网图)

    Android自定义View实现三角到八角的属性分布图-雷达图(蜘蛛网图) 前言 自定义View的关键点 绘制多边形 结尾 前言 刚开始学习自定义view,简单完成了一个属性分布器,可以实现三条到八条 ...

  8. c#控件弹幕效果_Android 自定义View修炼-自定义弹幕效果View

    一.概述 现在有个很流行的效果就是弹幕效果,满屏幕的文字从右到左飘来飘去.看的眼花缭乱,看起来还蛮cool的 现在就是来实现这一的一个效果,大部分的都是从右向左移动漂移,本文的效果中也支持从左向右的漂 ...

  9. Android 自定义View之随机数验证码(仿写鸿洋)

    前言 本文面向自定义view新手,但是希望你最好有一定的理论知识,或基础概念,有的地方可能会一笔带过并不会细讲,细讲篇幅就太长了. 本文仿写自鸿洋的自定义View (一),尽管过去了将近快7年之久,我 ...

最新文章

  1. java实现动态上传多个文件并解决文件重名问题
  2. Nginx配置proxy_pass转发的/路径问题
  3. linux ls 按 文件名 大小 时间 排序
  4. java SSM 框架 多数据源 代码生成器 websocket即时通讯 shiro redis 后台框架源码
  5. var和dynamic的区别及如何正确使用dynamic ?
  6. matlab 判断元素索引_matlab – 获取矩阵中n个最大元素的索引
  7. Java LocalDateTime类| 带示例的compareTo()方法
  8. java 保留html_好程序员Java培训分享Java包是什么?
  9. ssm框架搭建+easyui增删改查实现
  10. GDKOI 2016
  11. int在c语言中的作用,C语言中int,Uint,uint16等有什么区别以及用处
  12. 二建公路工程知识总结_2020二建公路实务:专题突破+高分攻略,拿分90稳过二建...
  13. HTMLCSS字体之引入外部字体
  14. 如何在WORD中插入图片自动编号,并引用图号【每天一个小技巧】
  15. java 汽车类_汽车类 - java代码库 - 云代码
  16. 手把手教你如何安装水晶易表——靠谱的安装教程
  17. 程序猿段子_程序员的那些段子
  18. 【R语言】必学包之lubridate包
  19. 读书狂想之《平凡的世界》不平凡的人生
  20. mac m1 解决fatal: unable to access ‘https://github.com/Homebrew/homebrew-core/‘ ;同时指定intel架构的brew 版本

热门文章

  1. C语言和Python语言数据交互
  2. smtplib python_smtplib —SMTP协议客户端
  3. git报错: [rejected] master -> master (fetch first)
  4. 大数据项目(三)————电商项目介绍(一)
  5. 大咖 | “大数据之父”达文波特:成功的数据科学家不一定要有研究生学位
  6. 并查集kuangbin专题
  7. FreeMarker概述
  8. 【转载】Linux中大于符号的用法
  9. eclipse彻底关闭debug模式
  10. Linux下使用CURL Post文件+入参