场景

实现效果如下

注:

博客:
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);
}
}

最新文章

  1. TFS Express backup and restore
  2. MongoDB-分片片键
  3. Openfire Strophe IE跨域问题
  4. MVC5中,加载分部视图,常见的方式
  5. Java设计模式 之 命令模式
  6. Android开发之手势滑动(滑动手势监听)详解
  7. hdoj 2620 Bone Collector(0-1背包)
  8. nrf51 官方PWM库
  9. emmet 教程 emmet快捷键大全
  10. 2019-02-18 扩展Python控制台实现中文反馈信息之二-正则替换
  11. 未在本地计算机上注册microsoft.ace.12.0的解决办法
  12. 自己实现HashMap
  13. iptables之端口限速
  14. 【NIO】Java NIO之缓冲
  15. [蓝桥杯]ALGO-122.算法训练_未名湖边的烦恼
  16. django admin管理后台中文添加问题
  17. 软件架构设计学习总结(19):详解分布式系统中的session同步问题
  18. iOS 开发者证书总结 in-house
  19. Python -- Scrapy 命令行工具(command line tools)
  20. 《JAVA与模式》之原型模式

热门文章

  1. 【java面试】集合类篇
  2. python+autoit用法
  3. http1.0、http1.x、http 2和https梳理
  4. HDU-6214 Smallest Minimum Cut(最少边最小割)
  5. Redis异常 | DENIED Redis is running in protected mode because protected mode is enabled
  6. java代码之美(14)---Java8 函数式接口
  7. 实验13:VLAN/TRUNK/VTP/
  8. nginx命令行及演示:重载、热部署、日志切割
  9. 用Go语言在Linux下调用新中新DKQ-A16D读卡器,读二代证数据
  10. HDU 3068 最长回文 (Manacher最长回文串)