场景

实现效果如下

 

 

注:

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

 

 

posted on 2020-01-04 10:34  霸道流氓  阅读(858)  评论(0编辑  收藏  举报