首页 > 其他分享 >canvas drawable 绘制图片时钟

canvas drawable 绘制图片时钟

时间:2023-11-24 11:04:01浏览次数:24  
标签:canvas int private getWidth import android drawable 时钟



文章目录

  • 1、功能介绍
  • 2、文件结构
  • 3、xml 文件
  • 4、MainActivity.java文件
  • 5、自定义的view 文件


1、功能介绍

1)通过 实例化 drawable 资源图片对象
2)调用 canvas 进行 图片的 绘制 和刷新

canvas drawable 绘制图片时钟_xml

上图指针分别是 三个 图片

2、文件结构

canvas drawable 绘制图片时钟_xml_02

3、xml 文件
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/lay_id"
    tools:context=".MainActivity">


    <com.example.ubuntu.mycanvasdraw.MyView
        android:id="@+id/myView_id"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

</RelativeLayout>
4、MainActivity.java文件
package com.example.ubuntu.mycanvasdraw;

import android.app.Activity;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.Window;
import android.view.WindowManager;
import android.widget.RelativeLayout;

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);


        requestWindowFeature(Window.FEATURE_NO_TITLE); //去掉标题栏
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                WindowManager.LayoutParams.FLAG_FULLSCREEN); //设置全屏
        setContentView(R.layout.activity_main);

    
    }
}
5、自定义的view 文件
package com.example.ubuntu.mycanvasdraw;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.drawable.Drawable;
import android.os.Handler;
import android.os.Message;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;

import java.util.Calendar;

public class MyView extends View {

    private String TAG  = "MyView: ";
    private final  int NEED_INVALIDATE = 100;

    private Drawable drawableHourPoint;  //时针 drawable 对象
    private Drawable drawableMinutePoint;
    private Drawable drawableSecondPoint;

    private Calendar mcalendar; //获取时间
    private int hourWide = 36; //时针 的 宽度
    private int hourHigh = 251; //时针 的 高度


    private int minuteWide = 32;  //分钟的宽度
    private int minuteHigh = 361; //分钟的高度


    private int secondWide = 16;  //秒针的宽度
    private int secondHigh = 324; //秒针的高度


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



    public MyView(Context context, AttributeSet attrs) {
        super(context, attrs);
        setWillNotDraw(false);
    }

    public MyView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    @Override
    protected void onDraw(Canvas canvas) {

        mcalendar=Calendar.getInstance();//获取时间对象

        drawHourPoint(canvas);
        drawaMinutePoint(canvas);
        drawaSecondPoint(canvas);
        handler.sendEmptyMessage(NEED_INVALIDATE);
    }


    //画秒针
    private void drawaSecondPoint(Canvas canvas) {
        if (drawableSecondPoint == null) {
            drawableSecondPoint = getResources().getDrawable(R.drawable.secondpoint);
            //drawableSecondPoint = Drawable.createFromPath("path"); 或者通过路径 从别的地方获取
            drawableSecondPoint.setBounds(((getWidth() - secondWide )/2)  , (getHeight()/2) - secondHigh ,
                    ((getWidth() + secondWide)/2) ,(getHeight()/2) );  //显示的 区域
        }

        int second=mcalendar.get(Calendar.SECOND);


        float senconddegree = (second/60f*360)  ;   //秒针旋转的角度
        Log.i(TAG," second: "  + second +
                "秒针 旋转 的角度: " + senconddegree);
        canvas.save();
        canvas.rotate(senconddegree , getWidth() / 2, getHeight() / 2);
        drawableSecondPoint.draw(canvas);

        canvas.restore();
    }

    //画分针
    private void drawaMinutePoint(Canvas canvas) {
        if (drawableMinutePoint == null) {
            drawableMinutePoint = getResources().getDrawable(R.drawable.minutepoint);
            drawableMinutePoint.setBounds(((getWidth() - minuteWide )/2)  , (getHeight()/2) - minuteHigh ,
                    ((getWidth() + minuteWide)/2),(getHeight()/2) );  //显示的 区域
        }

        int minute= mcalendar.get(Calendar.MINUTE);
        float minudegrees=  (minute/60f*360)  ;  //分针旋转的角度

        Log.i(TAG," minute: "  + minute +
                "时针 旋转 的角度: " + minudegrees);
        canvas.save();
        canvas.rotate(minudegrees , getWidth() / 2, getHeight() / 2);
        drawableMinutePoint.draw(canvas);

        canvas.restore();
    }


    //画时针
    private void drawHourPoint(Canvas canvas) {
        if (drawableHourPoint == null) {
            drawableHourPoint = getResources().getDrawable(R.drawable.hourpoint);
            drawableHourPoint.setBounds(((getWidth() - hourWide )/2)   , (getHeight()/2) - hourHigh  ,
                    ((getWidth() + hourWide)/2),(getHeight()/2));  //显示的 区域
        }

        int hour= mcalendar.get(Calendar.HOUR);
        int minute= mcalendar.get(Calendar.MINUTE);
        int second=mcalendar.get(Calendar.SECOND);

        if (hour > 12) {
            hour = hour - 12 ;
        }

        float hourdregrees=  (hour/12f*360) + (minute/60f*30) ;  //时针旋转的角度

        Log.i(TAG,"hour minute second +:" + hour+ ": " + minute + ": " + second +
                "时针 旋转 的角度: " + hourdregrees);
        canvas.save();
        canvas.rotate(hourdregrees, getWidth() / 2, getHeight() / 2);
        drawableHourPoint.draw(canvas);

        canvas.restore();

    }



    public Handler handler = new Handler(){
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            switch (msg.what) {
                case NEED_INVALIDATE :
                    //重新绘制界面
                    invalidate();//告诉UI主线程重新绘制
                    handler.sendEmptyMessageDelayed(NEED_INVALIDATE, 1000); //再次发送消息,递归调用,
                    break;
                default:
                    break;
            }
        }

    };


}


标签:canvas,int,private,getWidth,import,android,drawable,时钟
From: https://blog.51cto.com/u_15866638/8546120

相关文章

  • Tainted canvases may not be exported,视频帧截图跨域
    做原生相机拍照的时候遇见的有趣问题,视频流是上传到云服务器的在线链接,赋值到video的src上,然后使用canvas的drawImg方法去截取视频帧做照片,结果canvas报错视频跨域。解决方案:<videocrossorigin="anonymous"src="在线地址"ref="video"id="video"class="video"autoplay></v......
  • node-canvas 安装报错
    node-canvas安装报错内容一般如下....npmERR!commandC:\Windows\system32\cmd.exe/d/s/cnode-pre-gypinstall--fallback-to-build--update-binarynpmERR!Warning:Missinginputfiles:npmERR!C:\GTK\bin\libgmodule-2.0-0.dllnpmERR!C:\GTK\bin\libpang......
  • 14_DS1302实时时钟
    DS1302实时时钟介绍引脚定义和应用电路内部结构框图寄存器定义时序定义BCD码LCD1602显示年月日时分秒星期信息DS1302.c#include<REGX52.H>#include"DS1302.h"sbitDS1302_SCLK=P3^6;sbitDS1302_IO=P3^4;sbitDS1302_CE=P3^5;#defineDS1302_SECOND0x80......
  • 51时钟实验——DS1302芯片
    关于DS1302芯片:1、引脚说明: Vcc1:主电源;Vcc2:备份电源。当Vcc2>Vcc1+0.2VVcc2>Vcc1+0.2VVcc2>Vcc1+0.2VVcc2>Vcc1+0.2V时,由Vcc2向DS1302供电,当Vcc2<Vcc1时,由Vcc1向DS1302供电。SCLK:串行时钟,输入,控制数据的输入与输出;I/O:三线接口时的双向数据线;CE:输入信号,在读、写数据期......
  • 微信小程序使用canvas导出图片时提示报错为canvasToTempFilePath:fail fail canvas is
    uni使用小程序时,组件里面有个canvas,页面上面也有一个canvs。组件里面的canvas想导出图片,报canvasToTempFilePath:failfailcanvasisempty。在canvasToTempFilePath里面要加上第二个参数,传入this;uni.canvasToTempFilePath({canvasId:"canvas"......
  • Svg动画和Canvas动画有什么区别
    一、什么是SVG动画SVG(ScalableVectorGraphics)动画是指使用SVG技术创建的可缩放矢量图形进行动画效果的展示。SVG动画可以通过CSS或JavaScript来实现,常见的SVG动画包括以下几种类型:   CSS动画:使用CSS的@keyframes规则和animation属性来定义和控制SVG元素的动画效果。可以通过指......
  • 分享,GPS北斗卫星同步时钟服务器具体原理是什么?
    分享,GPS北斗卫星同步时钟服务器具体原理是什么?分享,GPS北斗卫星同步时钟服务器具体原理是什么?京准电子科技官微——ahjzsz时间同步的原理和技术1、有关时间的一些基本概念: 时间与频率之间互为倒数关系,两者密不可分,时间标准的基础是频率标准,由晶体振荡器决定时间的精度。 4......
  • canvas实现动态替换人物的背景颜色
    起因今天遇见一个特别有意思的小功能。就是更换人物图像的背景颜色。大致操作步骤就是:点击人物-实现背景颜色发生变化将图片绘画到canvas画布上我们需要将图片绘制到canvas画布上。这样做的目的是为了方便我们去操作像素点来更改颜色。首先创建Image的实例。将图片的地......
  • canvas绘制圆环
    初识canvascanvas我们可以理解为是一个画布。它是一个载体。我们的文字,图案,都是在这个载体(画布)上来进行操作的。canvas的5个要素canvas具有的5个要素:1.id元素的唯一标识2.width宽度3.height高度4.画笔,上下文canvas.getContext('2d')5.内容(文字,图形,其他)can......
  • vscode编写js canvas无代码提示的解决方法
    解决方法:如果是2d上下文,则在获取上下文的前一句加上/**@type{CanvasRenderingContext2D}*/如果是3d上下文,则加上/**@type{WebGLRenderingContext}*/letdrawing=document.querySelector("#canvas")if(drawing.getContext){/**@type......