▲ Android 动画望远镜效果

▲ Android 动画望远镜效果

写字板效果之后,实现望远镜效果,效果如下

在这里插入图片描述

【实现】
新建一张空白的位图,这张位图的大小与控件的大小一样,然后对背景图进行拉伸,画在这张空白的为图上。
在mDx mDy 都不是-1的时候,按下手指或者移动手指。将新建的mBitmapBG作为BitmapShader 设置给Paint,然后在手指所在的位置画圈,并把圈内的图片显示出来。

【代码】

初始化控件

 public TelescopeView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        mPaint = new Paint();
        mBitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.timg);

    }

实现 onTouchEvent方法

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        switch (event.getAction()){
            case MotionEvent.ACTION_DOWN:
                mDx = (int)event.getX();
                mDy = (int)event.getY();
                postInvalidate();
                return  true;

                case MotionEvent.ACTION_MOVE:
                    mDx = (int)event.getX();
                    mDy = (int)event.getY();
                    break;
            case MotionEvent.ACTION_UP:
            case MotionEvent.ACTION_CANCEL:
                mDx = -1;
                mDy = -1;
                break;
        }
        postInvalidate();
        return super.onTouchEvent(event);
    }

实现onDraw

   @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        if (mBitmapBG==null){
            mBitmapBG = Bitmap.createBitmap(getWidth(), getHeight(), Bitmap.Config.ARGB_8888);
            Canvas canvasbg = new Canvas(mBitmapBG);
            canvasbg.drawBitmap(mBitmap,null,new Rect(0,0,getWidth(),getHeight()),mPaint);
        }
        if (mDx!=-1&&mDy !=-1){
            mPaint.setShader(new BitmapShader(mBitmapBG,Shader.TileMode.REPEAT,Shader.TileMode.REPEAT));
            canvas.drawCircle(mDx,mDy,150,mPaint);
        }

    }

需要注意的一点

之所以在onDraw()方法中创建,mbitmapBG,而不在初始化代码中创建,是因为在初始化时,getWidth(),和getHeigh() 是获取不到值的。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/2838.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Hadoop生态系统介绍「建议收藏」

    Hadoop生态系统介绍「建议收藏」1、Hadoop生态系统概况Hadoop是一个能够对大量数据进行分布式处理的软件框架。具有可靠、高效、可伸缩的特点。Hadoop的核心是HDFS和Mapreduce,hadoop2.0还包括YARN。下图为hadoop的生态系统:2、HDFS(Hadoop分布式文件系统)源自于Google的GFS论文,发表于2003年10月,HDFS是GFS克隆版。是Hadoo

    2022年5月12日
    36
  • STM32驱动LCD1602程序(调试已成功)「建议收藏」

    STM32驱动LCD1602程序(调试已成功)「建议收藏」IO接线:RSPA8RWPB6EPB7LCD1602_IOPB8-PB15所有的口都配置成开漏输出,并且所有的口都通过10k电阻上拉至5V,部分电路图如下:程序代码LCD1602.C#include”lcd1602.h”voidLCD1602_GPIO_Init_Out()//LCD1602端口初始化,配置为输出{ GPIO_InitTypeDefGPIO_InitStructrue; RCC_APB2PeriphClockCmd(LCD1602_Timer_GPI

    2022年7月16日
    20
  • c语言注释快捷键_c语言多行注释快捷键

    c语言注释快捷键_c语言多行注释快捷键//注释多行快捷键Ctrl+kctrl+l//解注释多行快捷键Ctrl+kctrl+u

    2022年8月15日
    3
  • Python 生成随机数_python 随机字符串

    Python 生成随机数_python 随机字符串python中生成随机数主要使用random模块和numpy库中的random函数。前者主要用于生成随机数和实现序列中随机数和随机数列的挑选,后者用来生成a*b维的随机矩阵。一、random模块random模块中将近有7个函数都是可以用来生成随机数,列举如下:1.random.random()功能:随机生成一个[0,1)的浮点数示例:importrandomnumber=random.random()print(number)print(‘%.2f’%num

    2022年9月28日
    0
  • 【转】opencv中widthStep不一定等于width*nChannels的原因「建议收藏」

    【转】opencv中widthStep不一定等于width*nChannels的原因「建议收藏」【转】opencv中widthStep不一定等于width*nChannels的原因opencv里图片属性widthStep属性有点奇怪,它稍大于width*nChannels。如3*3的3通道bmp图片,所有像素RGB分量都为97,输出如下:图像详细参数nSize: 112imageSize:36nChannels:3height: 3wid

    2022年6月1日
    25
  • vi 命令 使用方法

    vi 命令 使用方法

    2021年11月14日
    46

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号