目标效果:
当鼠标按下左键在模拟器中移动,可以让图片跟着鼠标移动。
1.将activity_main.xml页面布局定义为FrameLayout帧布局,帧布局的特点就是控件默认位置都是在左上角。
activity_main.xml页面:
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/layout_frame" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity" > </FrameLayout>
2.新建类MovebleView.java,自定义可移动控件。
MovebleView.java页面:
package com.example.kongjian; import com.example.shubiao.R; 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 MovebleView extends View{ //基本的控件都是View的子类,所以继承View父类,View父类中没有无参构造方法 private float x; private float y; public float getX() { return x; } public void setX(float x) { this.x = x; } public float getY() { return y; } public void setY(float y) { this.y = y; } public MovebleView(Context context) { //初始化构造方法 super(context); x=0; //初始位置 y=100; } protected void onDraw(Canvas canvas){ //参数为画布 super.onDraw(canvas); Paint paint=new Paint(); //构建画笔 Bitmap bitmap=BitmapFactory.decodeResource(getResources(),R.drawable.flower); //引入图片资源,第一个参数为包含了图片的资源对象,第二个参数为图片资源的id canvas.drawBitmap(bitmap,x,y,paint); if(!bitmap.isRecycled()){ //如果图片没有被回收 bitmap.recycle(); //强行回收图片 } } }
package com.example.shubiao; import com.example.kongjian.MovebleView; import android.os.Bundle; import android.provider.ContactsContract.CommonDataKinds.Event; import android.app.Activity; import android.view.Menu; import android.view.MotionEvent; import android.view.View; import android.view.View.OnTouchListener; import android.widget.FrameLayout; public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); FrameLayout layoutFrame=(FrameLayout) findViewById(R.id.layout_frame); //查询容器 final MovebleView movebleView=new MovebleView(this); //实例自定义控件 movebleView.setOnTouchListener(new OnTouchListener() { //匿名内部类,控件的触摸方法 @Override public boolean onTouch(View v, MotionEvent event) { //触摸方法,第二个参数为移动事件 movebleView.setX(event.getX()); //修改坐标通过event获取鼠标的坐标值并赋值成自定义控件的坐标值 movebleView.setY(event.getY()); movebleView.invalidate(); //修改坐标后重新绘制图片 return true; } }); layoutFrame.addView(movebleView); //将控件添加到FrameLayout容器中 } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } }