欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

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

程序员文章站 2022-03-25 18:01:21
场景 实现效果如下 注: 博客: https://blog.csdn.net/badao_liumang_qizhi 关注公众号 霸道的程序猿 获取编程相关电子书、教程推送与免费下载。 实现 新建Android项目,首先打开activity_main.xml 修改其为FrameLayout帧布局管理 ......

场景

实现效果如下

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

 

 

注:

博客:

关注公众号
霸道的程序猿
获取编程相关电子书、教程推送与免费下载。

实现

新建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类

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

 

 

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

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

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

 

 

然后重写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);
    }
}