自定义view的简单使用
自定义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的简单使用相关推荐
- 球体动画Android,Android自定义View实现简单炫酷的球体进度球实例代码
前言 最近一直在研究自定义view,正好项目中有一个根据下载进度来实现球体进度的需求,所以自己写了个进度球,代码非常简单.先看下效果: 效果还是非常不错的. 准备知识 要实现上面的效果我们只要掌握两个 ...
- Android自定义View如此简单 实现点击动画+进度刷新的提交/下载按钮(填坑面试题)
SubmitButton 背景 实现思路 继承View 面试题:构造方法如何选择 自定义属性 面试题:styleable.AttributeSet.TypedArray的关系 测量宽高 面试题:UNS ...
- 支付宝芝麻信用页面自定义View的简单制作(续)
前两个月刚刚写了一篇关于支付宝芝麻信用页面自定义View的总结,感觉写的不太好,链接如下: http://blog.csdn.net/anny_lin/article/details/49474555 ...
- Android利用自定义View实现简单的足球战术板
参考自:http://blog.csdn.net/lmj623565791/article/details/46858663 学习Android初期,之前接触了一些UI设计,突发奇想想要做一个简单的足 ...
- android 字体描边实现,Android自定义View实现简单文字描边功能
本文实例为大家分享了Android实现简单文字描边功能的具体代码,供大家参考,具体内容如下 效果图: 实现代码: package com.example.zhangyu.myview.widget; ...
- Android 自定义view完全解析--带你通透了解自定义view
参考转自郭霖博客带你一步步深入了解View系列 Android LayoutInflater原理分析 相信接触Android久一点的朋友对于LayoutInflater一定不会陌生,都会知道它主要是用 ...
- Android自定义View实现三角到八角的属性分布图-雷达图(蜘蛛网图)
Android自定义View实现三角到八角的属性分布图-雷达图(蜘蛛网图) 前言 自定义View的关键点 绘制多边形 结尾 前言 刚开始学习自定义view,简单完成了一个属性分布器,可以实现三条到八条 ...
- c#控件弹幕效果_Android 自定义View修炼-自定义弹幕效果View
一.概述 现在有个很流行的效果就是弹幕效果,满屏幕的文字从右到左飘来飘去.看的眼花缭乱,看起来还蛮cool的 现在就是来实现这一的一个效果,大部分的都是从右向左移动漂移,本文的效果中也支持从左向右的漂 ...
- Android 自定义View之随机数验证码(仿写鸿洋)
前言 本文面向自定义view新手,但是希望你最好有一定的理论知识,或基础概念,有的地方可能会一笔带过并不会细讲,细讲篇幅就太长了. 本文仿写自鸿洋的自定义View (一),尽管过去了将近快7年之久,我 ...
最新文章
- java实现动态上传多个文件并解决文件重名问题
- Nginx配置proxy_pass转发的/路径问题
- linux ls 按 文件名 大小 时间 排序
- java SSM 框架 多数据源 代码生成器 websocket即时通讯 shiro redis 后台框架源码
- var和dynamic的区别及如何正确使用dynamic ?
- matlab 判断元素索引_matlab – 获取矩阵中n个最大元素的索引
- Java LocalDateTime类| 带示例的compareTo()方法
- java 保留html_好程序员Java培训分享Java包是什么?
- ssm框架搭建+easyui增删改查实现
- GDKOI 2016
- int在c语言中的作用,C语言中int,Uint,uint16等有什么区别以及用处
- 二建公路工程知识总结_2020二建公路实务:专题突破+高分攻略,拿分90稳过二建...
- HTMLCSS字体之引入外部字体
- 如何在WORD中插入图片自动编号,并引用图号【每天一个小技巧】
- java 汽车类_汽车类 - java代码库 - 云代码
- 手把手教你如何安装水晶易表——靠谱的安装教程
- 程序猿段子_程序员的那些段子
- 【R语言】必学包之lubridate包
- 读书狂想之《平凡的世界》不平凡的人生
- mac m1 解决fatal: unable to access ‘https://github.com/Homebrew/homebrew-core/‘ ;同时指定intel架构的brew 版本
热门文章
- C语言和Python语言数据交互
- smtplib python_smtplib —SMTP协议客户端
- git报错: [rejected] master -> master (fetch first)
- 大数据项目(三)————电商项目介绍(一)
- 大咖 | “大数据之父”达文波特:成功的数据科学家不一定要有研究生学位
- 并查集kuangbin专题
- FreeMarker概述
- 【转载】Linux中大于符号的用法
- eclipse彻底关闭debug模式
- Linux下使用CURL Post文件+入参