可拖动的组件,可更改为其它View

2024-06-06 08:48
文章标签 可更改 view 拖动 组件

本文主要是介绍可拖动的组件,可更改为其它View,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

可拖动的组件,可更改为其它View

效果图

参考图

自定义View源码

DragTextView


package com.demo.drag;import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.ViewGroup;
import android.widget.RelativeLayout;/*** Created by talon on 2020/5/21* note: 可拖动的View,这里是TextView,可以换成其他的View* 解决了更新视图时,该View坐标会重置的问题*/
public class DragTextView extends android.support.v7.widget.AppCompatTextView {private final String TAG = "MyDragTextView";private int mLastX;private int mLastY;RelativeLayout.LayoutParams params;public DragTextView(Context context) {super(context);}public DragTextView(Context context, AttributeSet attrs) {super(context, attrs);}public DragTextView(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);}@Overridepublic boolean onTouchEvent(MotionEvent event) {int parentWidth = ((ViewGroup) getParent()).getWidth();int parentHeight = ((ViewGroup) getParent()).getHeight();int x = (int) event.getRawX();int y = (int) event.getRawY();// 注意:xx.LayoutParams这里的xx应该是该组件的父布局类型// 注意:这句话必须在该组件已经添加到父布局中才会起作用,所以这句话我没有写在构造函数中,而是写在这里params = (RelativeLayout.LayoutParams) this.getLayoutParams();switch (event.getAction()) {case MotionEvent.ACTION_DOWN:mLastX = x;mLastY = y;break;case MotionEvent.ACTION_MOVE:int offSetX = x - mLastX;int offSetY = y - mLastY;// 限制边界。int left = getLeft() + offSetX;if (left<0)left = 0;if (left>(parentWidth-getWidth()))left = parentWidth-getWidth();int top = getTop() + offSetY;if (top<0)top = 0;if (top>(parentHeight-getHeight()))top= parentHeight-getHeight();int right = getRight() + offSetX;if (right<getWidth())right = getWidth();if (right>parentWidth)right = parentWidth;int bottom = getBottom() + offSetY;if (bottom<getHeight())bottom = getHeight();if (bottom>parentHeight)bottom = parentHeight;//                LogWrapper.e(TAG,"left:"+left+"_top:"+top+"_right:"+right+"_bottom:"+bottom);// 1.(不限制滑动范围)调用layout方法来重新放置它的位置
//                layout(getLeft() + offSetX, getTop() + offSetY, getRight() + offSetX, getBottom() + offSetY);// 2. (限制滑动范围)layout(left, top, right, bottom);mLastX = x;mLastY = y;break;case MotionEvent.ACTION_UP:
//                int screenWidth = ScreenUtils.getScreenWidth(getContext());
//                int screenHeight = ScreenUtils.getScreenHeight(getContext());// 左上右下 的 margin,后面两个参数必须要设置,不然在边界处可能会引起图片的变形params.setMargins(getLeft(), getTop(), parentWidth - (getLeft() + getWidth()), parentHeight - (getTop() + getHeight()));setLayoutParams(params);break;default:break;}return true;}
}

demo地址

https://download.csdn.net/download/u011368551/12453968

这篇关于可拖动的组件,可更改为其它View的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1035636

相关文章

公共筛选组件(二次封装antd)支持代码提示

如果项目是基于antd组件库为基础搭建,可使用此公共筛选组件 使用到的库 npm i antdnpm i lodash-esnpm i @types/lodash-es -D /components/CommonSearch index.tsx import React from 'react';import { Button, Card, Form } from 'antd'

vue, 左右布局宽,可拖动改变

1:建立一个draggableMixin.js  混入的方式使用 2:代码如下draggableMixin.js  export default {data() {return {leftWidth: 330,isDragging: false,startX: 0,startWidth: 0,};},methods: {startDragging(e) {this.isDragging = tr

React+TS前台项目实战(十七)-- 全局常用组件Dropdown封装

文章目录 前言Dropdown组件1. 功能分析2. 代码+详细注释3. 使用方式4. 效果展示 总结 前言 今天这篇主要讲全局Dropdown组件封装,可根据UI设计师要求自定义修改。 Dropdown组件 1. 功能分析 (1)通过position属性,可以控制下拉选项的位置 (2)通过传入width属性, 可以自定义下拉选项的宽度 (3)通过传入classN

ScrollView 往上滑动,里面的一个View停在某个位置的思路

1.scrollView的contentoffset 为view的左上角,减去此时scrollView的左上角 2.而且还不需要让那个红色的view removeFromSuperView ,直接self.view AddSubView 就会自动从原来的那个View脱离开来 3.以后遇到问题的思路。当发现UIView很许多奇特的效果的时候,思考它是不是在不断的改变父控件。 #pragma m

导航条下 ScrollView 第一个View去掉向下偏移的64px

self.automaticallyAdjustsScrollViewInsets=NO;      self.scrollView.contentInset=UIEdgeInsetsMake(-64, 0, 0, 0); self.automaticallyAdjustsScrollViewInsets=NO; 相同的意思。

android自定义View的和FramgentActivity的一个小坑

对于自定义View //加载样式TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.TitleBarView, defStyleAttr, 0);setTitle(typedArray.getString(R.styleable.TitleBarView_main_title));//不能写成

Transformers和Langchain中几个组件的区别

1.对于Transformers框架的介绍 1.1 介绍: transformers 是由 Hugging Face 开发的一个开源库,它提供了大量预训练模型,主要用于自然语言处理(NLP)任务。这个库提供的模型可以用于文本分类、信息抽取、问答、文本生成等多种任务。 1.2 应用场景: 文本分类:使用 BERT、RoBERTa 等模型进行情感分析、意图识别等。命名实体识别(NER):使用序列

怎么优化ArcEngine组件开发mfc程序界面?

🏆本文收录于「Bug调优」专栏,主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!! 问题描述   这种VS2015 + ArcEngine10.2开发的mfc小程序怎么优化界面,使系统看上去更美观 如上问题有来自我自身项目开发,有的收集网站

Vue3的Teleport:Teleport是Vue3的一个新功能,它允许我们将子组件渲染到父组件以外的地方,这在处理模态框、弹出窗口等情况时非常有用

I. Teleport 的概述 Teleport 的定义:   在 Vue 3.0 中,Teleport 是一个新的内置组件,它允许我们将任何部分的渲染内容 Teleport(传送)到 Vue 应用范围之外的地方。 换句话说,你可以控制片段,让它们在 DOM 中的任何位置渲染,而不仅仅是在当前组件内部。   Teleport 的效用和应用场景:   Teleport 的主要用途是处理在 UI

Android自定义View学习笔记03

Android自定义View学习笔记03 参考gitHub上面的开源项目CircleImageView 预备知识 BitMap类 BitMap位图类,其中有一个嵌套类叫Bitmap.Config,内部有四个枚举值。这个类的作用是定义位图存储质量,即存储一个像素的位数,以及是否能显示透明、半透明颜色(Possible bitmap configurations. A bitmap co