Android中实现自定义View组件并使其能跟随鼠标移动
2024-09-04 04:39:59
场景
实现效果如下
注:
博客:
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 = ;
bitmapY = ;
} @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);
}
}
最新文章
- TFS Express backup and restore
- MongoDB-分片片键
- Openfire Strophe IE跨域问题
- MVC5中,加载分部视图,常见的方式
- Java设计模式 之 命令模式
- Android开发之手势滑动(滑动手势监听)详解
- hdoj 2620 Bone Collector(0-1背包)
- nrf51 官方PWM库
- emmet 教程 emmet快捷键大全
- 2019-02-18 扩展Python控制台实现中文反馈信息之二-正则替换
- 未在本地计算机上注册microsoft.ace.12.0的解决办法
- 自己实现HashMap
- iptables之端口限速
- 【NIO】Java NIO之缓冲
- [蓝桥杯]ALGO-122.算法训练_未名湖边的烦恼
- django admin管理后台中文添加问题
- 软件架构设计学习总结(19):详解分布式系统中的session同步问题
- iOS 开发者证书总结 in-house
- Python -- Scrapy 命令行工具(command line tools)
- 《JAVA与模式》之原型模式
热门文章
- 【java面试】集合类篇
- python+autoit用法
- http1.0、http1.x、http 2和https梳理
- HDU-6214 Smallest Minimum Cut(最少边最小割)
- Redis异常 | DENIED Redis is running in protected mode because protected mode is enabled
- java代码之美(14)---Java8 函数式接口
- 实验13:VLAN/TRUNK/VTP/
- nginx命令行及演示:重载、热部署、日志切割
- 用Go语言在Linux下调用新中新DKQ-A16D读卡器,读二代证数据
- HDU 3068 最长回文 (Manacher最长回文串)