zoukankan      html  css  js  c++  java
  • Android笔记:波纹按钮

    转载学习自:菜鸟教程http://www.runoob.com

    ImageView有两个可以设置图片的属性,分别是:src和background

    常识:

    ①background通常指的都是背景,而src指的是内容!!

    ②当使用src填入图片时,是按照图片大小直接填充,并不会进行拉伸

    而使用background填入图片,则是会根据ImageView给定的宽度来进行拉伸

      1 package com.example.administrator.testt;
      2 
      3 import android.content.Context;
      4 import android.graphics.Canvas;
      5 import android.graphics.Paint;
      6 import android.os.SystemClock;
      7 import android.util.AttributeSet;
      8 import android.view.MotionEvent;
      9 import android.view.ViewConfiguration;
     10 import android.widget.ImageButton;
     11 
     12 public class MyButton extends android.support.v7.widget.AppCompatImageButton {
     13     private static final int INVALIDATE_DURATION = 15; //每次刷新的时间间隔
     14     private static int DIFFUSE_GAP = 10; //扩散半径增量
     15     private static int TAP_TIMEOUT; //判断点击和长按的时间
     16 
     17     private int viewWIdth,viewHeight;   //控件宽高
     18     private int pointX,pointY;          //空间原点坐标(左上角)
     19     private int maxRadio;               //扩散的最大半径
     20     private int shaderRadio;            //扩散的半径
     21 
     22     private Paint bottomPaint, colorPaint;  //画笔:背景和水波纹
     23     private boolean isPushBUtton;       //记录是否被按下
     24 
     25     private int eventX, eventY;         //触摸位置的X,Y坐标
     26     private long downTime = 0;          //按下的时间
     27 
     28 
     29     public MyButton(Context context,AttributeSet attrs) {
     30         super(context,attrs);
     31         initPaint();
     32         TAP_TIMEOUT = ViewConfiguration.getLongPressTimeout(); //判断多久之后判定为长按
     33 
     34     }
     35 
     36 
     37     private void initPaint(){
     38         colorPaint = new Paint();
     39         bottomPaint = new Paint();
     40         colorPaint.setColor(getResources().getColor(R.color.reveal_color,null));
     41         //getResources().getColor(int id)已过时,现已被getColor(int id,Theme theme)代替,theme可用null
     42         bottomPaint.setColor(getResources().getColor(R.color.bottom_color,null));
     43 
     44     }
     45 
     46     @Override
     47     public boolean onTouchEvent(MotionEvent event) {
     48         switch (event.getAction()){
     49             case MotionEvent.ACTION_DOWN:
     50                 if(downTime == 0)downTime = SystemClock.elapsedRealtime();
     51                 eventX = (int) event.getX();
     52                 eventY = (int) event.getY(); //获取点击的XY坐标
     53                 //计算最大半径
     54                 countMaxRadio();
     55                 isPushBUtton = true; //确认已被按下
     56                 postInvalidateDelayed(INVALIDATE_DURATION);
     57                 break;
     58             case MotionEvent.ACTION_UP:
     59             case MotionEvent.ACTION_CANCEL:
     60                 if (SystemClock.elapsedRealtime() - downTime < TAP_TIMEOUT) {
     61                     DIFFUSE_GAP = 30;       //扩散半径增量
     62                     postInvalidate();       //刷新界面
     63                 } else {
     64                     clearData();
     65                 }
     66                 break;
     67         }
     68 
     69         return super.onTouchEvent(event);
     70     }
     71 
     72     @Override
     73     protected void dispatchDraw(Canvas canvas) {
     74         super.dispatchDraw(canvas);
     75         if(!isPushBUtton) return; //如果按钮没有被按下则返回
     76         //绘制按下后的整个背景
     77         canvas.drawRect(pointX, pointY, pointX + viewWIdth, pointY + viewHeight, bottomPaint);
     78         canvas.save();
     79         //绘制扩散圆形背景
     80         canvas.drawCircle(eventX,eventY,shaderRadio,colorPaint);
     81         canvas.restore();
     82         //直到半径等于最大半径
     83         if(shaderRadio < maxRadio){
     84             postInvalidateDelayed(INVALIDATE_DURATION,
     85                     pointX, pointY, pointX + viewWIdth, pointY + viewHeight);
     86             shaderRadio += DIFFUSE_GAP;
     87         }else{
     88             clearData();
     89         }
     90     }
     91 
     92     private void countMaxRadio(){
     93         if (viewWIdth > viewHeight) {
     94             if (eventX < viewWIdth / 2) {
     95                 maxRadio = viewWIdth - eventX;
     96             } else {
     97                 maxRadio = viewWIdth / 2 + eventX;
     98             }
     99         } else {
    100             if (eventY < viewHeight / 2) {
    101                 maxRadio = viewHeight - eventY;
    102             } else {
    103                 maxRadio = viewHeight / 2 + eventY;
    104             }
    105         }
    106 
    107     }
    108 
    109     private void clearData(){
    110         downTime = 0;
    111         DIFFUSE_GAP = 10;
    112         isPushBUtton = false;
    113         shaderRadio = 0; //扩散的半径
    114         postInvalidate();   //刷新界面
    115 
    116     }
    117 
    118     @Override
    119     protected void onSizeChanged(int w, int h, int oldw, int oldh) {
    120         super.onSizeChanged(w, h, oldw, oldh);
    121         this.viewWIdth = w;
    122         this.viewHeight = h;
    123     }
    124 }

    ImageButton和Button的区别:

    A.ImageButton用图像来表现按钮;

    设置方式:android:src="img_id"

    android:src="@drawable/ic_launcher_background"

    B.ImageButton控件的Click事件是配合System.Web.UI.ImageClickEventHandler委托工作的,ImageButton可获取所点击的X,Y坐标,详情见例子.

  • 相关阅读:
    JAVA中“==”和equals
    C++中各种容器的类型与特点
    程序员面试宝典 笔记 第七章
    程序员面试宝典 笔记(第六章 预处理 const 和sizeof())
    某学长面经
    tomcat 启动日志乱码
    Jenkins关闭和重启实现方式
    linux下svn版本控制的常用命令大全
    Java中的增强 for 循环 foreach
    JS 中 cookie 的使用
  • 原文地址:https://www.cnblogs.com/Ravenzzz/p/9758107.html
Copyright © 2011-2022 走看看