zoukankan      html  css  js  c++  java
  • 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);
        }
    }

  • 相关阅读:
    常见的 Java 错误及避免方法
    常见的 Java 错误及避免方法
    面试中有哪些经典的数据库问题?
    面试中有哪些经典的数据库问题?
    面试中有哪些经典的数据库问题?
    十点总结,为何 Linux 如此深得人心
    十点总结,为何 Linux 如此深得人心
    十点总结,为何 Linux 如此深得人心
    C++_template_栈的链式存储及实现
    关于RN的热更新
  • 原文地址:https://www.cnblogs.com/badaoliumangqizhi/p/12148150.html
Copyright © 2011-2022 走看看