• Android中实现自定义View组件并使其能跟随鼠标移动


    场景

    实现效果如下

    注:

    博客:
    https://blog.csdn.net/badao_liumang_qizhi
    关注公众号
    霸道的程序猿
    获取编程相关电子书、教程推送与免费下载。

    实现

    新建Android项目,首先打开activity_main.xml

    修改其为FrameLayout帧布局管理器,并添加Id属性和背景照片

    <?xml version="1.0" encoding="utf-8"?>
    <FrameLayout 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:id="@+id/frameLayout"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@drawable/bg"
        tools:context=".MainActivity">
    
     
    
    </FrameLayout>

    然后在包下新建自定View类dog类

    使其继承View类,然后声明两个float变量来存储其位置。在其构造方法中对位置进行初始化。

    然后重写onDraw方法,根据指定的位置进行重绘view

    package com.badao.defineview;
    
    import android.content.Context;
    import android.graphics.Bitmap;
    import android.graphics.BitmapFactory;
    import android.graphics.Canvas;
    import android.graphics.Paint;
    import android.view.View;
    
    public class DogView extends View {
    
        public float bitmapX;
        public  float bitmapY;
        public DogView(Context context) {
            super(context);
            bitmapX = 290;
            bitmapY = 130;
        }
    
        @Override
        protected void onDraw(Canvas canvas) {
            super.onDraw(canvas);
            //新建画笔对象
            Paint paint = new Paint();
            //获取照片
            Bitmap bitmap = BitmapFactory.decodeResource(this.getResources(), R.drawable.dog);
            //绘制照片
            canvas.drawBitmap(bitmap,bitmapX,bitmapY,paint);
            //回收图片
            if(bitmap.isRecycled())
            {
                bitmap.recycle();
            }
    
        }
    }

    然后回到MainActivity,获取layout,声明自定义的view并设置触摸事件监听器,将触摸位置的坐标赋值给自定义view的位置,然后重绘view,并将其添加到layout中

    package com.badao.defineview;
    
    import androidx.appcompat.app.AppCompatActivity;
    
    import android.os.Bundle;
    import android.view.MotionEvent;
    import android.view.View;
    import android.widget.FrameLayout;
    
    public class MainActivity extends AppCompatActivity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            //获取layout
            FrameLayout frameLayout = (FrameLayout) findViewById(R.id.frameLayout);
            //声明自定义View
            final DogView dogView = new DogView(this);
            //设置触摸事件监听器
            dogView.setOnTouchListener(new View.OnTouchListener() {
                @Override
                public boolean onTouch(View v, MotionEvent event) {
                    //获取触摸位置的X的坐标
                    dogView.bitmapX = event.getX();
                    //获取触摸位置Y的坐标
                    dogView.bitmapY = event.getY();
                    //需要重绘view
                    dogView.invalidate();
                    return true;
                }
            });
            //将自定义view添加到layout中
            frameLayout.addView(dogView);
        }
    }

  • 相关阅读:
    Python3基础 str """ 多行字符串
    Python3基础 str *运算 重复拼接字符串
    Python3基础 time.localtime 当前系统的年月日 时分秒
    Python3基础 time 索引值访问元组中的年月日时分秒
    Python3基础 sys.path 查看搜索路径变量
    Python3基础 sys.path.append 增加模块的搜索路径
    C#中ListView的简单使用方法
    C#的注释和快速开启工具的命令
    sql server2008安装错误(无法处理异常)
    启动计算机总弹出页面配置问题
  • 原文地址:https://www.cnblogs.com/badaoliumangqizhi/p/12148150.html
Copyright © 2020-2023  润新知