安卓漫漫路之可移动的按钮.

深信服AC1000-B1200到手第一步:从开箱到激活上网的保姆级图文指南 本文提供深信服AC1000-B1200企业级行为管理设备的详细开局使用指南,涵盖从开箱验机、物理连接到网络配置、安全加固及设备激活的全流程。通过图文并茂的步骤解析,帮助用户快速完成设备初始化并实现安全上网,特别适合初次接触该设备的网络管理员参考。 阅读详情

项目中需要一个刷新的按钮,不愿意再去循规守矩,想了想决定要弄一个可以移动的按钮来替代之前的固定按钮:

首先的问题就是怎么让控件可以移动呢?

移动的话肯定就是咱们给按钮Button进行setOnTouchListener()监听器,来控制他的落下,移动,抬起事件:

事件一:   落下 ACTION-DOWN

例:获取当前的像素点的X值Y值;

事件二:移动 ACTION-MOVE

例:获取咱们拖动按钮带来的位移量,动态增加记录当前新的位置,对按钮进行重绘,并且在位移时还要有控制逻辑不让按钮被我们移动出屏幕,详情请看代码.

事件三:抬起 ACTION-UP

例:抬起时这里得有判断,因为平常的按钮,也会有抬起事件,可能用词不太恰当,但是意思是正确的,所以这边得有判断逻辑验证此抬起事件是位移之后的抬起事件还是默认的抬起事件;

直接撸代码给大家得了,程序员还是用代码说话:


首先看布局文件:


<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.administrator.demo_keyidong_button.MainActivity">


    <Button
        android:id="@+id/movebtn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="hello_world" />
</RelativeLayout>




 其次看界面代码:

package com.example.administrator.demo_keyidong_button;

import android.app.Activity;
import android.os.Bundle;
import android.util.DisplayMetrics;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewTreeObserver;
import android.view.Window;
import android.widget.Button;
import android.widget.Toast;

public class MainActivity extends Activity {

    private Button movebtn;//可拖动按钮
    private boolean clickormove = true; //点击或拖动,点击为true,拖动为false
    private int downX, downY;   //按下时的X,Y坐标
    private boolean hasMeasured = false; //ViewTree是否已被测量过,是为true,否为false
    private View content; //界面的ViewTree
    private int screenWidth,screenHeight; //ViewTree的宽和高

    @Override
    protected void onCreate(Bundle savedInstanceState) {


        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        content = getWindow().findViewById(Window.ID_ANDROID_CONTENT);//获取界面的ViewTree根节点View

        DisplayMetrics dm = getResources().getDisplayMetrics();//获取显示屏属性
        screenWidth = dm.widthPixels;
        screenHeight = dm.heightPixels;

        ViewTreeObserver vto = content.getViewTreeObserver();//获取ViewTree的监听器
        vto.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {

            @Override
            public boolean onPreDraw() {

// TODO Auto-generated method stub
                if(!hasMeasured)
                {

                    screenHeight = content.getMeasuredHeight();//获取ViewTree的高度
                    hasMeasured = true;//设置为true,使其不再被测量。

                }
                return true;//如果返回false,界面将为空。

            }

        });
        movebtn = (Button) findViewById(R.id.movebtn);
        movebtn.setOnTouchListener(new View.OnTouchListener() {//设置按钮被触摸的时间

            int lastX, lastY; // 记录移动的最后的位置

            @Override
            public boolean onTouch(View v, MotionEvent event) {

// TODO Auto-generated method stub
                int ea = event.getAction();//获取事件类型
                switch (ea) {
                    case MotionEvent.ACTION_DOWN: // 按下事件

                        lastX = (int) event.getRawX();
                        lastY = (int) event.getRawY();
                        downX = lastX;
                        downY = lastY;
                        break;

                    case MotionEvent.ACTION_MOVE: // 拖动事件

// 移动中动态设置位置
                        int dx = (int) event.getRawX() - lastX;//位移量X
                        int dy = (int) event.getRawY() - lastY;//位移量Y
                        int left = v.getLeft() + dx;
                        int top = v.getTop() + dy;
                        int right = v.getRight() + dx;
                        int bottom = v.getBottom() + dy;

//++限定按钮被拖动的范围
                        if (left < 0) {

                            left = 0;
                            right = left + v.getWidth();

                        }
                        if (right > screenWidth) {

                            right = screenWidth;
                            left = right - v.getWidth();

                        }
                        if (top < 0) {

                            top = 0;
                            bottom = top + v.getHeight();

                        }
                        if (bottom > screenHeight) {

                            bottom = screenHeight;
                            top = bottom - v.getHeight();

                        }

//--限定按钮被拖动的范围

                        v.layout(left, top, right, bottom);//按钮重画


// 记录当前的位置
                        lastX = (int) event.getRawX();
                        lastY = (int) event.getRawY();
                        break;

                    case MotionEvent.ACTION_UP: // 弹起事件

                        //判断是单击事件或是拖动事件,位移量大于5则断定为拖动事件

                            if (Math.abs((int) (event.getRawX() - downX)) > 5
                                || Math.abs((int) (event.getRawY() - downY)) > 5)

                            clickormove = false;

                        else

                            clickormove = true;

                        break;

                }
                return false;

            }

        });
        movebtn.setOnClickListener(new View.OnClickListener() {//设置按钮被点击的监听器

            @Override
            public void onClick(View arg0) {
// TODO Auto-generated method stub
                if (clickormove)

                    Toast.makeText(MainActivity.this, "hello,您触发了默认的点击抬起事件",
                            Toast.LENGTH_SHORT).show();

            }

        });

    }
}


这个效果虽然简陋,但是大家的智慧是无限的,后续的扩展优化还是靠大家自己去实现.


项目直达下载通道为:简单的可以移动的Button




如有问题请多指正,您的指正使我更我正确的前行.




三菱FX5U运动控制(步进) 三菱FX5U脉冲定位控制,原点回归,相对定位,绝对定位,运动控制案例。 阅读详情

相关推荐

【3DSlicer】基于心脏ct影像重建3d模型及导出

软件:3DSlicer4.11 基于心脏ct影像重建3d模型

Liuees的博客 1万+

“DeepNight-in-kotlin“一个纯看妹纸的Kotlin开源项目

转载请标明出处:http://blog.csdn.net/donkor_/article/details/78825038 DeepNight-in-kotlin 陪你度过每一个深夜,妹纸看不停 看够了代码家的妹纸,来看看豆瓣的妹纸。 Github地址: https://github.com/ChenYXin/DeepNight-in-kotlin Description 妹纸图片来...

Sahara_Savage 2万+

别再纠结选哪个向量库了!我用Spring AI + Redis Stack 7.2,5分钟搞定企业知识库RAG原型

本文介绍了如何利用Spring AI和Redis Stack 7.2快速构建企业级RAG应用,解决向量数据库选型难题。Redis Stack 7.2集成了RediSearch模块,支持向量相似性搜索,具备高性能、低成本、零学习成本等优势,特别适合中小团队快速搭建知识库系统。通过实战代码示例,展示了从环境准备到核心功能实现的完整流程。

weixin_29061041的博客 270

动态规划全解析

本人学习算法的时候,一直对动态规划报有一种恐惧的心理,直到学习了下面链接的dp全解析,才慢慢撸起动态规划的题目: http://www.cnblogs.com/sdjl/articles/1274312.html 对于一道题目能否用dp,关键考虑以下几点: 1、构造问题所对应的过程。 2、思考过程的最后一个步骤,看看有哪些选择情况。        3、找到最后一步的子问题,确保符

webnoob 1万+

基于DBSCAN聚类算法的超像素实时分割

Real-Time Superpixel Segmentation by DBSCAN Clustering Algorithm 摘要 在本文中,我们提出了一种基于密度的带噪声应用空间聚类(DBSCAN)算法的50帧/秒实时图像超像素分割方法。为了降低超像素算法的计算量,我们采用了一种快速的两步框架。在第一个聚类阶段,使用具有颜色相似性和几何约束的DBSCAN算法对像素进行快速聚类,然后在第二个合并阶段,通过颜色和空间特征定义的距离度量,将小簇按其邻域合并为超像素。为了在这两个步骤中获得更好的超像素,定义了

yttt的博客 3492

STM32串口DMA双缓冲机制实战:提升数据传输效率的终极方案

本文深入解析了STM32串口DMA双缓冲机制的核心原理与实战配置。通过对比传统中断方式,阐述了双缓冲如何实现数据接收与处理的“无缝接力”,从而在工业传感器数据采集等高负载场景下,将CPU占用率降至极低水平并彻底避免数据丢失。文章提供了基于标准外设库的详细配置步骤、中断处理逻辑及性能实测数据,是提升嵌入式系统串口通信效率和可靠性的终极方案。

weixin_29192365的博客 79

【破解软件】知音漫客免费看更多漫画

历史文章推荐: 1、漫客栈破解版 2、漫画岛破解版 3、漫画台破解版 4、二次元漫画破解版 【软件名称】: 知音漫客(免费版) 【软件版本】: v_4.9.5 【软件大小】: 23.25MB 【支持系统】: 安卓系统 【亲测演示】: 软件无需登录 包含更多漫画 分类超多超详细 最新漫画更新及时 会员漫画显示被锁不用担心 点击观看直接解锁 包含丰富的媒体合作 所以漫画很齐全 希望大...

moyanxiaoq的博客 5万+

【成功安装】Ubuntu22.04极简方式安装Nvidia驱动

今天下午安装了实机的Ubuntu,面临在Linux上安装Nvidia的问题,被这个问题困扰了一整个下午,各种报错整的我头大。后来发现了不需要按照传统的方式去Nvidia官网下载,再命令行安装,直接在线安装即可。

清筱明的博客 5345

转移到ios下载安卓_转移到ios下载-转移到ios app下载v2.10.0 安卓最新版-2265安卓网...

转移到ios app是一款非常好用的手机换机app,用户可以通过该软件把安卓手机的文档和数据完美的转移到ios中,不用担心换手机后数据丢失,并且该软件操作简单,有需要的可以到2265安卓网下载体验!转移到ios介绍Move to iOS 是苹果公司为安卓客户开发的一个软件,本来是 iOS 9 系统中的一个新功能,苹果在今年的 WWDC 大会上向世人介绍了这款应用。当安卓老用户转向使用 iPhone...

weixin_42336364的博客 2万+

《【一看就会】Autoware.universe的“规划”部分源码梳理》系列文章目录(持续更新中)

第零章:Planning综述 第一章:【一】全局路径生成模块——mission_planner 第二章:【二】路径行为规划模块——behavior_path_planner第一部分——behavior_path_planner模块 第三章:【二】路径行为规划模块——behavior_path_planner第二部分——behavior_path_planner_common模块(1) 第四章:【二】路径行为规划模块——behavior_path_planner第三部分——behavior_path_plan

weixin_48386130的博客 2339

我的python学习之路

Python 是一门功能强大且易于学习的编程语言,广泛应用于数据分析、人工智能、Web 开发、自动化等领域。以下是一个 Python 学习路径的总结,帮助你系统地掌握 Python 编程。

数据知道的博客 3万+

漫画大全更新了。。。。。

无会员,10万+本漫画,统统免费!!! 最新最热门的免费漫画大全,最全最二次元的撸漫平台,超多正版高清彩漫尽在漫画大全APP! 《斗罗大陆》《斗破苍穹》《凤逆天下》《妃夕妍雪》《穿越西元3000后》《纯情丫头火辣辣》《勇者是女孩》《龙族》《哑舍》《暴走邻家》等等,全部免费,喜欢的统统都到碗里来!!! 欢迎下载使用   ...

Fly的学习博客 4万+

太美了!现代女主jk海军风穿搭四视图

哪个女孩子初高中的时候不买几套JK衣服啊,穿上完全是青春女孩。那还愣着干啥,不得也给你的漫剧女主也穿上!直接就是分享三套JK穿搭,红棕双麻花辫配经典水手服,是那种乖乖巧巧的元气学妹;粉色羊毛卷双马尾,搭配蝴蝶结和小挎包甜度直接拉满;还有灰棕色侧麻花辫,浅蓝上衣配黑色百褶裙,温柔里又带点小酷。下面把这三套角色的完整提示词分享出来,喜欢哪套就拿去参考,改改发型和配色,还能继续解锁新角色!

欢迎来到鸾姝淡月博客,专为程序员和编程爱好者打造的技术博客。我们分享编程语言趋势、开发工具、编程哲学、职业发展等,助你掌握新技术,优化技能,激发编程热情。 51

www.hackhome.com

 www.hackhome.com

zgyjava的专栏 2万+

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

心情不好时就来看看这篇文章吧...(转)

* 学会 沉默 有时候,你被人误解,你不想争辩,所以选择沈默。本来就不是所有的人都得了解你,因此你认为不必对全世界喊话。却也有时候,你被最爱的人误解,你难过到不想争辩,也只有选择沈默。全世界都可以不懂你,但他应该懂,若他竟然不能懂,还有什么话可说?生命中往往有连舒伯特都无言以对的时刻,毕竟不是所有的是非都能条列清楚,甚至可能根本没有真正的是与非。那么,不想说话,就不说吧,在多说无...

weixin_30497527的博客 869

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

福利应用更新,这几款都是老司机喜欢的

iOS应用更新微X纯净更新到7.0.17漫漫lu。ltu短视频。点击下方获取下载地址获取地址后,我们去safari浏览器粘贴访问就行了! ...

qq_34718767的博客 3万+

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

打飞机小游戏破解版

打飞机小游戏破解版 #include&amp;lt;iostream&amp;gt; #include&amp;lt;windows.h&amp;gt; #include&amp;lt;conio.h&amp;gt; #include&amp;lt;time.h&amp;gt; #include&amp;lt;string&amp;gt; using namespace std; /*=============

Zhao_Chongyan的博客 4560

python 破解js加密cookie,突破521错误-还没有成功,后面有时间再看

参考1:爬虫遭遇状态码521陷阱 破解js加密cookie,参考代码:xiantang/Spider/tree/master/Anti_Anti_Spider_521 参考2:域名信息521js破解 工具1:代码格式化工具 | | | 我是找IP代理时遇到的,http://www.66ip.cn/areaindex_1/1.html, 后面慢慢发现,有很多相关项: 浏览器; IP; 时间; O...

hugh_博客标题 4563

喜欢动漫的小伙伴看过来

现在有好几款动漫app分享给你,每一款都设计极简,风格小清新,颜值高,实用好用。分享一:M漫这是一款高质量的漫画软件;极简美观,简洁干净,使用流畅,加载速度极快,实际体验极佳;支持多个优质源,支持各种强大的搜索功能和分类功能,支持下载功能,支持丰富的设置选项。软件支持安卓版本。分享二:樱桃漫画这是一款极简漫画软件;它的主要特点是支持小说和漫画两种功能,一个软件相当于多个软件;支持强大的分类功能和搜索功能,可以帮你找到很多优质的小说和漫画,软件支持安卓版本。分享三:Cimoc这是一款宝漫画软件;风格简洁,支持

duhunst71的博客 2万+

java 大顶堆的构建和排序

基本原理就不说了,代码慢慢撸!!!!!!!import java.util.Arrays; public class HeapSort { public static void main(String[] args) { //int [] array ={1,2,5,6,3,4,7,8,9,12,11,0}; int [] array = {2,3,4,5,6,7}; he...

qi_Baby的博客 8458

request+BeautifulSoup:下载《笔趣看》网小说《第九特区》

# -*- coding:UTF-8 -*- from bs4 import BeautifulSoup import requests, sys import time """ 类说明:下载《笔趣看》网小说《第九特区》 Parameters: 无 Returns: 无 Modify: 2020-10-16 """ class downloader(object): def __init__(self): #self.server = 'http://ww.

bensam的博客 2420

快速开发趣事:我与小白妹纸的漫漫撸码路

快速开发趣事:我与小白妹纸的漫漫撸码路 最近,活儿又来了,真是屋漏偏逢连阴雨,经过半年的洗礼能用得上的开发就我一个人了,怎么办呢,唉呀妈呀,脑壳疼脑壳疼… 这不,老总又要找我开会了。 “小王啊,最近公司要上一个新项目,但是公司能提供的资源有限,不知道你对这个项目有什么想法?” 我:“这个项目工作量有点大,我可能需要有人协助,...

力软敏捷开发框架 10万+

apk如何进行反编译/关于android

2020年2月3日晚 我想反编译一个apk用来学习,结果发现,网上的文章可真nice,费了九牛之力,终于成功。(网上好多文章都是盗的,根本不讲清楚,在那胡说,对此本人竖起大大的拇指),具体过程如下。 1、下载工具 链接:https://pan.baidu.com/s/1e_WVJRuKGBaz7-n6T-lcgQ 提取码:enqz 不赚你们积分,网盘自取,tools文件里面包含三个文件 说明:(...

qq_45890619的博客 8808

adobe reader XI打开大约十几秒就闪退问题解决方法大全

dobe reader XI打开大约十几秒就自动退出怎么解决? 转自:https://www.fengjunzi.com/blog-55539.html 方法一、更新补丁 注意:先请安装11.0.00正式版,再打11.0.23更新补丁包。因为官方并没有提供11.0.23的简体中文版完整安装包,所以必须这样升级! 下载地址: Adobe Reader XI 11.0.00 简体中文版http://ardownload.adobe.com/pub/adobe/reader/win/11.x/11.0.00

凝望星空 3万+

快速开发:我和实习妹纸的撸码故事(2)

就要过年了,也不知道各位同行过得开不开心呢!反正六六我是开心的!为什么呢?自从杨小花来了以后,我第一次感觉上班也是一件很美妙的事情~~~那种被妹纸崇拜的感觉真的是相当美好啊~~~而且这也不是全部,最开心的是,领导给我升职加薪了。以后我在部门也不只是一个简单的开发人员了,我也是一个组长了,兼职带带实习生。 闲话不多说了,下面来给大家说一下,最近这段时间我和小花的撸码日常。大家都知道小花是刚来我们公

endless0709的博客 2042

iOS 的奇淫技巧

http://www.jianshu.com/p/50b63a221f09

努力~ 1744
上一篇: 安卓漫漫路之读取本地html文件.
下一篇: 安卓漫漫路之碎片Fragment不同包下的区别.
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值