自定义可拖动TextView

写自定义拖动控件要了解的一些知识点:

1.View.getLeft()  view.getTop()  view.getRight()  view.getBottom( )

这四个方法是View类的方法:作用是获取view左边沿、右边沿到Y轴的距离,上边沿、下边沿到X轴的距离(坐标轴是以父布局左上角为坐标原点的坐标系),可以简单看成是view的左上角和右下角的坐标(view的外观为一个矩形)。

扩展:View.getX( )、View.getY( )是获取view在父布局中的位置,也是该View的左上角坐标,其中View.getX( ) = View.getLeft( ) View.getY( )=View.getTop( )

2.MotionEvent.getX( )、MotionEvent.getY( )方法

这两个方法是获取在触摸条件下,手指相对于view左上角水平和竖直方向的距离。

扩展:MotionEvent.getRawX( )和MotionEvent.getRawY( )是获取在触摸条件下,手指相对于手机屏幕左上角水平和竖直方向的距离,通常可用来判断滑动距离是否有效。

3.Layout(int left,int top,int right,int bottom)方法用来控制View的位置。

该方法是使View移动的关键,要正确计算出 left  top  right  bottom的值,通常用上一状态的值(1中的四个方法)  加上  在水平或竖直方向移动的距离就可以了

大致了解了这一系列方法,就可以简单写出可拖动的自定义控件,代码如下:

package com.example.android_dragbutton;

import android.content.Context;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.widget.TextView;

public class DragTV extends TextView {

	private float startx;// down事件发生时,手指相对于view左上角x轴的距离
	private float starty;// down事件发生时,手指相对于view左上角y轴的距离
	private float endx; // move事件发生时,手指相对于view左上角x轴的距离
	private float endy; // move事件发生时,手指相对于view左上角y轴的距离
	private int left; // DragTV左边缘相对于父控件的距离
	private int top; // DragTV上边缘相对于父控件的距离
	private int right; // DragTV右边缘相对于父控件的距离
	private int bottom; // DragTV底边缘相对于父控件的距离
	private int hor; // 触摸情况下,手指在x轴方向移动的距离
	private int ver; // 触摸情况下,手指在y轴方向移动的距离

	public DragTV(Context context, AttributeSet attrs, int defStyle) {
		super(context, attrs, defStyle);
		// TODO Auto-generated constructor stub
	}

	public DragTV(Context context, AttributeSet attrs) {
		this(context, attrs, 0);
		// TODO Auto-generated constructor stub
	}

	public DragTV(Context context) {
		this(context, null);
		// TODO Auto-generated constructor stub
	}

	@Override
	public boolean onTouchEvent(MotionEvent event) {
		// TODO Auto-generated method stub
		switch (event.getAction()) {
		case MotionEvent.ACTION_DOWN:
			// 手指刚触摸到屏幕的那一刻,手指相对于View左上角水平和竖直方向的距离:startX startY
			startx = event.getX();
			starty = event.getY();
			break;
		case MotionEvent.ACTION_MOVE:
			// 手指停留在屏幕或移动时,手指相对与View左上角水平和竖直方向的距离:endX endY
			endx = event.getX();
			endy = event.getY();
			// 获取此时刻 View的位置。
			left = getLeft();
			top = getTop();
			right = getRight();
			bottom = getBottom();
			// 手指移动的水平距离
			hor = (int) (endx - startx);
			// 手指移动的竖直距离
			ver = (int) (endy - starty);
			// 当手指在水平或竖直方向上发生移动时,重新设置View的位置(layout方法)
			if (hor != 0 || ver != 0) {
				layout(left + hor, top + ver, right + hor, bottom + ver);
			}
			break;
		case MotionEvent.ACTION_UP:
			break;
		default:
			break;
		}
		return true;
	}

}

Demo下载地址:http://download.csdn.net/detail/laoziyueguo3/8456849

时间: 2024-10-11 21:02:51

自定义可拖动TextView的相关文章

Android学习笔记18:自定义Seekbar拖动条式样

Android学习笔记18:自定义Seekbar拖动条式样

Android项目实战(十):自定义倒计时的TextView

原文:Android项目实战(十):自定义倒计时的TextView 项目总结 -------------------------------------------------------------------------------------------- 有这么一个需求: 我有一个ListView,每一个列表项 布局如上图,顶部一个大图片展示,中部一个音频播放,底部一个描述文字. 在这个界面,一次只能点击一个列表项的播放按钮,那么我直接在ListView所属的activity创建了唯一的

Android自定义Seekbar拖动条式样

SeekBar拖动条可以由用户控制,进行拖动操作.比如,应用程序中用户需要对音量进行控制,就可以使用拖动条来实现. 1.SeekBar控件的使用 1.1SeekBar常用属性 SeekBar的常用属性有以下一些: android:max[integer]//设置拖动条的最大值 android:progress[integer]//设置当前的进度值 android:secondaryProgress[integer]//设置第二进度,通常用做显示视频等的缓冲效果 android:thumb[dra

项目需求:自定义倒计时的TextView

现在这么一个需求: 我有一个ListView,每一个列表项 布局如上图,顶部一个大图片展示,中部一个音频播放,底部一个描述文字. 在这个界面,一次只能点击一个列表项的播放按钮,那么我直接在ListView所属的activity创建了唯一的一个MediaPlayer,然而,这不是问题,所有的音频方面的播放冲突都解决了 问题就在中部的音频播放,我需要点击左边的播放按钮,然后右边有一个剩余时间要跟随着变化,当然点击暂停的时候,剩余时间也要暂停 首先,这里运用了购物车功能的原理实现按钮的操作.Andro

自定义垂直拖动的seekbar进度条

系统自定义的seekbar为横向拖动的样式,需要纵向的时则需要自己定义,网上很多说了重写系统SeekBar中onDraw()的方法,但是我使用的时候不知道为什么拖动条和点偏离了,不在一条直线上,好气... 然后用了另一篇中改进之后的自定义bar,效果才正常,下面贴出代码 1 import android.content.Context; 2 import android.graphics.Canvas; 3 import android.util.AttributeSet; 4 import a

自定义div 拖动。键盘上下左右键移动,ctrl+Q控制是否可以移动,ctrl+回车,返回初始状态

<!doctype html> <html> <head> <meta charset="utf-8"> <meta name="author" content="智能社 - zhinengshe.com" /> <meta name="copyright" content="智能社 - zhinengshe.com" /> <t

Android自定义之TextView跑马灯的监听

TextView都有跑马灯的效果,如果说让你去监听跑马灯效果的执行,我觉得这个需求有点二了,但是也要实现. 思路: 1.自定义View  继承TextView   这种方法过于麻烦,只是监听一个跑马灯而已. 2.自定义SPan.简单好用,扩展TextView的功能. 关键代码如下: @Override public void draw(Canvas canvas, CharSequence text, int start, int end, float x, int top, int y, in

利用自定义可垂直滚动的Textview开发双色球滚动效果

先看效果图: 这里.我们自定义了一个Textview package com.example.myscroltextview.view; import java.util.ArrayList; import android.content.Context; import android.graphics.Canvas; import android.os.Handler; import android.os.Message; import android.util.AttributeSet; i

自定义View之案列篇(三):仿QQ小红点

光棍节快到了,提前祝愿广大的单身猿猴,早日脱单,尽快找到另一半. 一直觉得 QQ 的小红点非常具有创新,新颖.要是自己也能实现类似的效果,那怎一个爽字了得. 先来看看它的最终效果: 效果图具有哪些效果: 在拉伸范围内的拉伸效果 未拉出拉伸范围释放后的效果 拉出拉伸范围再拉回的释放后的效果 拉出拉伸范围释放后的爆炸效果 涉及的相关知识点: onLayout 视图位置 saveLayer 图层相关知识 Path 的贝赛尔曲线 手势监听 ValueAnimator 属性动画 一.拉伸效果 我们先来讲解