Android如何创建可拖动的图片控件

作者:疯狂-的-蜗牛 时间:2022-11-25 04:02:00 

本文实例为大家分享了Android创建可拖动图片控件的具体代码,供大家参考,具体内容如下

重载、自绘

1、从View派生一个控件类 ,构造函数中调用父类构造器。

2、重载其onDraw函数,在里面绘制图片。(和windows的MFC有种似曾相识的感觉,可能安卓借鉴了windows的模式吧)

消息处理

拖动图片的消息,主要是处理按下和移动两个消息,重载onTouchEvent。数学知识(平移):在ACTION_DOWN时记录下坐标点,在ACTION_MOVE时根据当前位置与按下时的位置算出平移量。刷新控件,导致控件重绘,重绘时移动绘制的左上角坐标即可。

刚开始时,只是收到了ACTION_DOWN消息,ACTION_MOVE消息就是捕捉不到,上网搜了下,原来是我在onTouchEvent最后调用了父类函数return super.onTouchEvent(event);父类里面返回false表示对这些消息不予关注,后续的ACTION_MOVE和ACTION_UP就不会进来了。

代码和配置

activity的XML配置


<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:layout_width="fill_parent"
 android:layout_height="fill_parent"
 android:orientation="vertical" >
 <com.example.timertest.DragImageView  
   android:id="@+id/div"
   android:layout_width="fill_parent"
   android:layout_height="fill_parent"
 />
</LinearLayout>

 控件的自绘代码


package com.example.timertest;

import java.util.ArrayList;
import android.annotation.SuppressLint;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.PointF;
import android.graphics.Rect;
import android.graphics.RectF;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import android.view.WindowManager;

@SuppressLint("ClickableViewAccessibility")
public class DragImageView extends View{

private Bitmap bmp = null;
 private PointF orgPos = new PointF(0, 0);
 private PointF downPos = new PointF(0, 0);
 private PointF movePos = new PointF(0, 0);
 private boolean bMove = false;
 private int nDstWidth = 0;
 private int nDstHeight = 0;
 private Rect rcSrc = new Rect(0, 0 , 0, 0);
 private RectF rcDst = new RectF(0, 0, 0, 0);
 private Paint paint = null;
 public DragImageView(Context context) {
   super(context);
   // TODO Auto-generated constructor stub
   paint = new Paint(Paint.ANTI_ALIAS_FLAG);
   //setOnClickListener(new DivOnClickListener());
   //setOnTouchListener(l);
 }

public DragImageView(Context context, AttributeSet attrs) {
   super(context, attrs);
   //bmp = img;
   paint = new Paint(Paint.ANTI_ALIAS_FLAG);
 }
 public DragImageView(Context context, AttributeSet attrs, int defStyleAttr){
   super(context, attrs, defStyleAttr);
   paint = new Paint(Paint.ANTI_ALIAS_FLAG);
 }

public void SetImage(Bitmap img){
   if ( bmp != null ){
     bmp = null;
   }
   bmp = img;
 }

@Override
 public void addTouchables(ArrayList<View> views) {
   // TODO Auto-generated method stub
   super.addTouchables(views);
 }

@Override
 public boolean onTouchEvent(MotionEvent event) {
   // TODO Auto-generated method stub
   float fPosX = event.getX();
   float fPosY = event.getY();
   int nAct = event.getAction();
   switch ( nAct ){
   case MotionEvent.ACTION_MOVE:{
     if ( !bMove )
       bMove = true;
     movePos.x = fPosX - downPos.x;
     movePos.y = fPosY - downPos.y;
     downPos.x = fPosX;
     downPos.y = fPosY;
     invalidate();
   }
     break;
   case MotionEvent.ACTION_DOWN:{
     downPos.x = fPosX;
     downPos.y = fPosY;
   }
     break;
   case MotionEvent.ACTION_UP:
     break;
   }
   //一定要返回ture,如果返回父类方法即false,则后续的move up 消息都不会触发。
   return true;
   //return super.onTouchEvent(event);
 }

@Override
 protected void onDraw(Canvas canvas) {
   // TODO Auto-generated method stub
   super.onDraw(canvas);
   if ( bmp == null )
     return ;
   int nWidth = bmp.getWidth();
   int nHeight = bmp.getHeight();
   if ( !bMove ){
     orgPos = GetCenterPos();
   }
   else{
     orgPos.x += movePos.x;
     orgPos.y += movePos.y;
   }
   rcSrc.right = nWidth;
   rcSrc.bottom = nHeight;
   rcDst.left = orgPos.x;
   rcDst.top = orgPos.y;
   rcDst.right = orgPos.x+nDstWidth;
   rcDst.bottom = orgPos.y+nDstHeight;
   canvas.drawBitmap(bmp, rcSrc, rcDst, paint);
 }

protected PointF GetCenterPos(){
   PointF pt = new PointF(0, 0);
   if ( bmp == null )
     return pt;
   WindowManager wm = (WindowManager)getContext().getSystemService(Context.WINDOW_SERVICE);
   //wm.getDefaultDisplay().getSize(pt);
   int nScrWidth = wm.getDefaultDisplay().getWidth();
   @SuppressWarnings("deprecation")
   int nScrHeight = wm.getDefaultDisplay().getHeight();
   int nWidth = bmp.getWidth();
   int nHeight = bmp.getHeight();
   float fImgRate = nWidth/(float)nHeight;
   float fScrRate = nScrWidth/(float)nScrHeight;
   if ( nWidth>nScrWidth && nHeight>nScrHeight ){
     if ( fImgRate > fScrRate ){

nDstWidth = nScrWidth;
       nDstHeight = (int)(nScrWidth/fImgRate);

}
     else{

nDstHeight = nScrHeight;
       nDstWidth= (int)(nScrHeight*fImgRate);

}
   }
   else if ( nWidth>nScrWidth ){
     nDstWidth = nScrWidth;
     nDstHeight = nHeight;
   }
   else if ( nHeight>nScrHeight ){
     nDstWidth = nWidth;
     nDstHeight = nScrHeight;
   }
   else{
     nDstWidth = nWidth;
     nDstHeight = nHeight;
   }
   pt.y = (nScrHeight-nDstHeight)/2.0f;
   pt.x = (nScrWidth-nDstWidth)/2.0f;
   return pt;
 }

}

其中GetCenterPos函数是根据图片尺寸计算适合屏幕居中的方法。

运行程序

Android如何创建可拖动的图片控件

Android如何创建可拖动的图片控件

来源:https://blog.csdn.net/mfcing/article/details/48790235

标签:Android,拖动,控件
0
投稿

猜你喜欢

  • JAVA HashMap详细介绍和示例

    2023-04-07 00:17:43
  • 通过Html网页调用本地安卓(android)app程序代码

    2022-05-10 10:14:34
  • c#可以创建任意控件的拖动方法

    2021-11-30 01:51:08
  • JAVA实现账户取款和存款操作

    2023-08-22 16:31:45
  • Java中如何动态创建接口的实现方法

    2023-11-25 15:13:02
  • 如何在WorkManager中处理异步任务详解

    2021-09-12 14:05:29
  • Java设计模式之java组合模式详解

    2022-05-02 07:52:38
  • JDBC自定义连接池过程详解

    2023-11-17 13:27:55
  • tcp socket客户端和服务端示例分享

    2021-10-22 13:24:17
  • 将InputStream转化为base64的实例

    2023-04-24 02:30:59
  • Android编程实现系统重启与关机的方法

    2022-01-09 20:56:49
  • Android 蓝牙连接 ESC/POS 热敏打印机打印实例(蓝牙连接篇)

    2021-12-02 10:21:18
  • c#中值类型和引用类型的基础教程

    2021-10-20 18:03:41
  • Android webveiw 出现栈错误解决办法

    2023-11-29 01:54:26
  • Android控件View的文字周围添加图标

    2023-02-20 04:04:44
  • Java Vector实现班级信息管理系统

    2023-11-25 03:09:09
  • Android Studio 3.0的下载安装教程

    2021-08-10 04:00:45
  • Java类锁、对象锁、私有锁冲突测试

    2022-04-25 05:06:22
  • Android中系统自带锁WalkLock与KeyguardLock用法实例详解

    2023-11-26 01:50:49
  • Java 调用Restful API接口的几种方式(HTTPS)

    2021-06-19 02:26:55
  • asp之家 软件编程 m.aspxhome.com