组件
安卓系统中提供了许多内置的组件
但是有什么需要自定义组件,试下自定义的效果
实例
1、需求:实现图片拖拽,如下按住图片可以随意拖拽图片
2、MyView.java:自定义View
package com.example.custom_view;
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 MyView extends View {
public float bitX;
public float bitY;
public MyView(Context context) {
super(context);
// 初始化坐标
this.bitX = 290;
this.bitY = 290;
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
// 画图工具
Paint paint = new Paint();
// 位图加载
Bitmap bitmap = BitmapFactory.decodeResource(this.getResources(),R.mipmap.xq);
// 画图
canvas.drawBitmap(bitmap, this.bitX, this.bitY,paint);
// 判断是否已经被回收了
if(bitmap.isRecycled()){
// 如果bitmap已经被会回收,就清理掉跟这个bitmap相关的对象及其相关的位图数据
bitmap.recycle();
}
}
}
3、MainActivity.java:拖拽实现
package com.example.custom_view;
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);
// 通过id获取帧布局框架,也就是自定义View加载到哪个activity就获取哪个
FrameLayout frameLayout = (FrameLayout)findViewById(R.id.myLayout);
MyView myView = new MyView(this);
// 重写自定义View的触摸方法
myView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
// 获取触摸的x、y坐标,并修改,从而实现移动
myView.bitX = motionEvent.getX();
myView.bitY = motionEvent.getY();
// 强制View重绘,也就是会调用自定义View的onDraw方法进行重绘
myView.invalidate();
return true;
}
});
frameLayout.addView(myView);
}
}
4、actvity_main.xml
<?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:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity"
android:background="@mipmap/bg"
android:id="@+id/myLayout"
>
</FrameLayout>