精华内容
下载资源
问答
  • 安卓布局文件2

    2021-02-14 16:17:21
    控制面板拖拽属性 1.如果我们直接往Tablelayout中添加组件的话,那么这个组件将沾满一行 2.如果我们想一行上有多个组件的话,就要添加一个TableRow的容器,把组件都丢到里面 3.tablerow中的组件个数就决定了该行有...

    控制面板拖拽属性
    1.如果我们直接往Tablelayout中添加组件的话,那么这个组件将沾满一行
    2.如果我们想一行上有多个组件的话,就要添加一个TableRow的容器,把组件都丢到里面
    3.tablerow中的组件个数就决定了该行有多少列,而列宽的宽的宽度由列中得最宽的单元格决定
    4.tablerow的layout——width属性,默认是fill_parent的,我们自己设置成其他的值也不会生效!!!但是layou-height默认是wrapten——content的,我们却可以自己设置大小
    5.整个表格布局的宽度取决于父容器的宽度(占满父容器本身)
    6.有多少行就要自己数了,一个lablerow一行,一个单纯的组件也行!多少则看tablerow中的租金按个数,组件最多的就是tablelayout的列数
    三个常用属性
    adroid:collapsecolumns:设置被隐藏的序列号
    android:shrinkcolumns:设置允许被收缩的序列号
    android:stretchcolumns:设置运行被拉伸的列的序列号
    表格布局
    表格布局就是让控件以表格的形式来排列组织的,只要将组建或是信息放在但与那个中,控件就可以整齐的排列
    在tablelayout中,行数由tablerow对象控制的,及布局有多少tableflow对象,就有多少行
    网格布局
    网格布局是安卓新增的布局,它实现了控件的交错显示,能够避免因布局嵌套对设备性能的影响,格力与自由布局和开发
    网格布局是一组无限细的直线将绘图区域分成行列和单元格,并指定控件的显示区域和控件在该区域的显示方式

    展开全文
  • 其实我自己平时还是比较喜欢总结一些知识点的,首先咱们来说说都有几种方式来实现view在屏幕中的随意拖拽,经过自己平时工作中的积累和查资料,大致实现view拖拽有如下几种方式, 1:使用view的绘制onDraw(), 2:...

    其实我自己平时还是比较喜欢总结一些知识点的,首先咱们来说说都有几种方式来实现view在屏幕中的随意拖拽,经过自己平时工作中的积累和查资料,大致实现view拖拽有如下几种方式,

    1:使用view的绘制onDraw(),

    2:使用动画

    3;使用布局

    4:使用viewDragHelper:

    首先来说第一种方式,

    public class CustomView extends View {
     
        private static final int WIDTH = 40;
         
        private Rect rect = new Rect(0, 0, WIDTH, WIDTH);//绘制矩形的区域
        private int deltaX,deltaY;//点击位置和图形边界的偏移量
        private static Paint paint = new Paint();//画笔
         
        public CustomView(Context context, AttributeSet attrs) {
            super(context, attrs);
            paint = new Paint();
            paint.setColor(Color.RED);//填充红色
        }
         
        @Override
        protected void onDraw(Canvas canvas) {
            canvas.drawRect(rect, paint);//画矩形
     
        }
         
        @Override
        public boolean onTouchEvent (MotionEvent event) {
            int x = (int) event.getX();
            int y = (int) event.getY();
            switch(event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                if(!rect.contains(x, y)) {
                    return false;//没有在矩形上点击,不处理触摸消息
                }
                deltaX = x - rect.left;
                deltaY = y - rect.top;
                break;
            case MotionEvent.ACTION_MOVE:
            case MotionEvent.ACTION_UP:
                Rect old = new Rect(rect);
                //更新矩形的位置
                rect.left = x - deltaX;
                rect.top = y - deltaY;
                rect.right = rect.left + WIDTH;
                rect.bottom = rect.top + WIDTH;
                old.union(rect);//要刷新的区域,求新矩形区域与旧矩形区域的并集
                invalidate(old);//出于效率考虑,设定脏区域,只进行局部刷新,不是刷新整个view
                break;
            }
            return true;//处理了触摸消息,消息不再传递
        }
     
    }
    我们可以通过自定义view在他的触摸事件中作处理,然后在事件中不断的获取新位置进行重新绘制,这样就实现了自由拖动。


    第二种方式:

    btn_drag.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View view, MotionEvent motionEvent) {
            switch (motionEvent.getActionMasked()) {
                case MotionEvent.ACTION_DOWN:
                    lastX = motionEvent.getRawX();
                    lastY = motionEvent.getRawY();
                    return true;
                case MotionEvent.ACTION_MOVE:
                    //  不要直接用getX和getY,这两个获取的数据已经是经过处理的,容易出现图片抖动的情况
                    float distanceX = lastX - motionEvent.getRawX();
                    float distanceY = lastY - motionEvent.getRawY();
    
                    float nextY = btn_drag.getY() - distanceY;
                    float nextX = btn_drag.getX() - distanceX;
    
                    // 不能移出屏幕
                    if (nextY < 0) {
                        nextY = 0;
                    } else if (nextY > containerHeight - btn_drag.getHeight()) {
                        nextY = containerHeight - btn_drag.getHeight();
                    }
                    if (nextX < 0)
                        nextX = 0;
                    else if (nextX > containerWidth - btn_drag.getWidth())
                        nextX = containerWidth - btn_drag.getWidth();
    
                    // 属性动画移动
                    ObjectAnimator y = ObjectAnimator.ofFloat(btn_drag, "y", btn_drag.getY(), nextY);
                    ObjectAnimator x = ObjectAnimator.ofFloat(btn_drag, "x", btn_drag.getX(), nextX);
    
                    AnimatorSet animatorSet = new AnimatorSet();
                    animatorSet.playTogether(x, y);
                    animatorSet.setDuration(0);
                    animatorSet.start();
    
                    lastX = motionEvent.getRawX();
                    lastY = motionEvent.getRawY();
    
                    case MotionEvent.ACTION_UP:
                        lastX = motionEvent.getRawX();
                        lastY = motionEvent.getRawY();
                        break;
            }
            return false;
        }
    在actionDown中获取按下的位置,再move事件中不断的获取下一个目标点,然后根据偏移量得到控件下一次要到的位置,最后通过属性动画的形式来将空间拖动到屏幕的人一位置。


    第三种方式:

    public boolean onTouch(View v, MotionEvent event) {
    		switch (event.getAction()) {
    		case MotionEvent.ACTION_DOWN:
    			Toast.makeText
    				(MainActivity.this, "Down...", Toast.LENGTH_SHORT).show();
    			lastX = (int) event.getRawX();
    			lastY = (int) event.getRawY();
    //			System.out.println("lastX:"+lastX+",lastY:"+lastY);
    			break;
    		case MotionEvent.ACTION_MOVE:
    			int dx = (int) event.getRawX() - lastX;
    			int dy = (int) event.getRawY() - lastY;
    
    			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:
    			break;
    		}
    		return true;
    	}
    其实三种方式都差不多,都是在事件中做相应的处理,这种就是通过重新布局来改变view的位置,来达到目的。

    第四种可以参考鸿洋大神的文章http://blog.csdn.net/lmj623565791/article/details/46858663

    其实应该还可以使用socller来实习,我回头再研究一下

    展开全文
  • gridview拖拽

    2013-07-08 14:43:33
    安卓gridview布局随意拖拽,改变位置
  • 一、准备工作 ...本例子实现,一个可变布局列表,有9种布局item大小,每个item可拖拽切换位置 二、程序实现 项目结构截图 主界面列表程序 public class DragListActivity extends AppCompatActivity {

    代码地址如下:
    http://www.demodashi.com/demo/11271.html

    一、准备工作

    • 准备一台安卓设备手机,4.4以上版本
    • 本例子实现,一个可变布局列表,有9种布局item大小,每个item可拖拽切换位置

    二、程序实现

    • 项目结构截图
    • 主界面列表程序
        public class DragListActivity extends AppCompatActivity {
            private RecyclerView mRecyclerView;
            private ListAdapter mListAdapter;
    
            @Override
            protected void onCreate(@Nullable Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_list);
                initView();
            }
    
            private void initView() {
                mRecyclerView = (RecyclerView) findViewById(R.id.rv_list);
                mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
                mListAdapter = new ListAdapter(this, getData());
                mRecyclerView.setAdapter(mListAdapter);
            }
    
            private List<DemoEntity> getData() {
                List<DemoEntity> demoEntities = new ArrayList<>();
                for (int i = images.length; i > 0; i--) {//9
                    List<String> picStrings = new ArrayList<>();
                    for (int j = 0; j < i; j++) {
                        picStrings.add(images[j]);
                    }
                    demoEntities.add(new DemoEntity(picStrings));
                }
                return demoEntities;
            }
    
            private String[] images = new String[]{
                    "https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1498024420832&di=5aa012750e828d3ef0c3f789a36e2347&imgtype=0&src=http%3A%2F%2Fimage.tianjimedia.com%2FuploadImages%2F2015%2F204%2F30%2F5ED1I1R45I1R.jpg",
                    "https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1498024420832&di=7a5226ba75156eb2d270e7b79bdb3707&imgtype=0&src=http%3A%2F%2Fimage.tianjimedia.com%2FuploadImages%2F2015%2F204%2F26%2F71H003OBEC6I.jpg",
                    "https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1498024420831&di=78e6711286a797838ba659d3ffb71b50&imgtype=0&src=http%3A%2F%2Fimage.tianjimedia.com%2FuploadImages%2F2015%2F204%2F25%2FWC9015475YJ9.jpg",
                    "https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1498024421112&di=ca179c35d92159b0f3d692f334b1021d&imgtype=0&src=http%3A%2F%2Fimg.tupianzj.com%2Fuploads%2Fallimg%2F140506%2F1-140506160101.jpg",
                    "https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1498024421112&di=3522c0c7f522369c0840012bc3886fa4&imgtype=0&src=http%3A%2F%2Fimg.tupianzj.com%2Fuploads%2Fallimg%2F140506%2F1-140506160102-50.jpg",
                    "https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1498024421111&di=83f6400e4644b91db81047e4b67be8d4&imgtype=0&src=http%3A%2F%2Fimg.tupianzj.com%2Fuploads%2Fallimg%2F140506%2F1-140506160120-50.jpg",
                    "https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1498024421111&di=216984c5a5163891965c499cb020322a&imgtype=0&src=http%3A%2F%2Fimg.tupianzj.com%2Fuploads%2Fallimg%2F140506%2F1-140506160126-50.jpg",
                    "https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1498024421110&di=0cd844d61e951abe5249aa9c660d37c5&imgtype=0&src=http%3A%2F%2Fimg.tupianzj.com%2Fuploads%2Fallimg%2F140506%2F1-140506160135.jpg",
                    "https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1498024421108&di=86bf19c2d8d47beaf5cad6797c4da4eb&imgtype=0&src=http%3A%2F%2Fimg.tupianzj.com%2Fuploads%2Fallimg%2F140506%2F1-140506160300.jpg",
            };
    
        }
    • 适配器代码
        public class ListAdapter extends RecyclerView.Adapter<ListAdapter.ViewHolder> {
            private List<DemoEntity> mDemoEntities;
            private Context mContext;
    
            public ListAdapter(Context mContext, List<DemoEntity> demoEntities) {
                this.mContext = mContext;
                mDemoEntities = demoEntities;
            }
    
            @Override
            public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
                View v = LayoutInflater.from(mContext).inflate(R.layout.item_view, parent, false);
                ViewHolder viewHolder = new ViewHolder(v);
                return viewHolder;
            }
    
            @Override
            public void onBindViewHolder(ViewHolder holder, int position) {
                //设置是否可以拖拽,必须执行在bindData之前
                holder.mImageNice9Layout.setCanDrag(true);
                holder.mImageNice9Layout.bindData(mDemoEntities.get(position).pictures);//入参:集合
                //位置item点击事件
                holder.mImageNice9Layout.setItemDelegate(new ImageNice9Layout.ItemDelegate() {
                    @Override
                    public void onItemClick(int position) {
                        Toast.makeText(mContext, "位置" + position, Toast.LENGTH_SHORT).show();
                    }
                });
            }
    
            @Override
            public int getItemCount() {
                return mDemoEntities.size();
            }
    
            class ViewHolder extends RecyclerView.ViewHolder {
                ImageNice9Layout mImageNice9Layout;
    
                public ViewHolder(View itemView) {
                    super(itemView);
                    mImageNice9Layout = (ImageNice9Layout) itemView.findViewById(R.id.item_nice9_image);
                }
            }
        }
    • 其他代码都在依赖库,具体下载demo查阅

    三、运行效果

    四、其他补充

    一个可变布局列表,有9种布局item大小,每个item可拖拽切换位置

    代码地址如下:
    http://www.demodashi.com/demo/11271.html

    注:本文著作权归作者,由demo大师发表,拒绝转载,转载需要作者授权

    展开全文
  • 最近项目需要使用GirdView来实现添加阅读频道和删除阅读频道的功能,...首先需要记录一下第一次给Github项目上图,然后我们需要简单的分析一下,首先我们的布局不仅仅是单一的item,而是有两个标题栏,然后后面的就...

    最近项目需要使用GirdView来实现添加阅读频道和删除阅读频道的功能,查找了网上很多饿的开源项目,却没有完全可以实现项目功能的,所以决定把项目的这个功能控件抽取成开源框架来方便大家使用。Github开源项目地址:DragGridView-master
    在这里插入图片描述
    首先需要记录一下第一次给Github项目上图,然后我们需要简单的分析一下,首先我们的布局不仅仅是单一的item,而是有两个标题栏,然后后面的就是统一的item,item之间可以拖拽位置,点击可以把item从上往下、从下往上两个方向移动。
    那么我们是不是就应该使用GridLayout来替代GridView来实现这个整体的布局?

    展开全文
  • 我们有时在xml布局文件中做了一些细微的变化,语法上没有任何问题,但是运行程序的时候却报错...出现这个问题其实是因为自己开始的时候·1写了或者直接拖拽了两个控件,这时在Android编译环境的R文件中已经生成了对应
  • 全新的中文安卓快速开发工具

    千次阅读 2019-07-01 15:06:47
    安卓项目的可视界面设计器(支持任意位置拖拽布局、线性布局、相对布局等等) 代码输入和智能提示 通过修改JAVA编译器实现中英文混合编写代码 开发工具安卓工程插件简介: 以上的图都是VcnStudio开发安卓项目的...
  • 不知你是否还记得桌面布局分析一文中的launcher.xml布局文件中根布局下嵌套的一个看似没啥用的DragLayer布局,它既不像Workspace那样作为PagedView容器占据... 我们知道,在安卓桌面长按某个应用图标时可以拖拽进...
  • 安卓View的事件分发

    2017-03-22 16:06:53
    安卓的事件分发机制使界面显示的控件能够响应用户的点击、长按、拖拽、快滑等操作。但是如果对事件分发的原理理解不深,有时候就会有一些困扰。比如:事件冲突导致内嵌的控件无法响应事件等,如何Activity设置多层...
  • 这两个组建的使用十分简单,在eclipse的可视化界面上直接拖拽布局中即可。当用户在事件日期选择器上进行选择之后,需要加将用户的选择读取出来,这需要给组件添加相应的监听器。 一 日期拾取器 1.在eclipse可视...
  • 这两个组建的使用十分简单,在eclipse的可视化界面上直接拖拽布局中即可。当用户在事件日期选择器上进行选择之后,需要加将用户的选择读取出来,这需要给组件添加相应的监听器。 一 日期拾取器  1.在eclipse...
  • 安卓新型布局-可视化布局类似于IOS可直接拖拽在xml文件上填充控件,自动完成一些基本属性。但个人感觉自动拖拽相对来说不能完全达到UI效果,需要细调,所以对于一些基本属性必须要掌握。由于约束布局的特殊性,被...
  • 后来才发现安卓后期做屏幕适配,这样拖拽布局方式是很low的,会给以后开发增加不少麻烦的。入门之后就要好好认识一下布局了。  布局简单来说就是容器,控件都要放在布局中。Android项目目录下有一个layout,那...
  • 安卓手机-TSF桌面

    2013-02-27 22:47:49
    您可以很自由地把单个或多个应用从应用页面中创建快捷方式并拖拽到任何一个自定义页面,或在自定义页面中把各种控件自由的进行页面切换、角度旋转等操作,从而布局属于您的个性化页面. 侧面栏提供了各种TSF SHELL 3D...
  • 黑马安卓52期视频教程

    热门讨论 2015-06-24 22:15:48
    01、安卓基础+JNI(14天)-------------------------- day01_Android应用开发-快速入门 01_网络制式的概念 02_android简单历史 03_Android体系结构 04_JVM和DVM的区别 05_下载SDK 06_SDK目录结构 07_模拟器的创建 ...
  • 7.约束性布局改为线性布局 8.找一个图片做为背景,最好图片颜色浅一点 9.用拖拽或copy的方法把图片background.jpg弄到drawable文件夹中,然后点击ok 10.添加一些属性 11.添加标签并设置相关属性 12.修改
  • 一、知识点 标签(TextView) 按钮(Button) 媒体播放器(MediaPlayer) 进度条(ProgressBar) 线程(Thread) 消息处理器(Handler) 列表视图(ListView) ...拖拽条(SeekBar) 二、功能 数据
  • 这系列的博客是我对安卓开发从0入门的学习笔记,正在持续更新中... 一、对布局的修改 1. 选择不同的主题 1 2. 在布局中,用TextView添加文本 布局的左上角出现了HelloWorld 3、添加按钮 进入...
  • 下载网络资源并存储到本地 一.知识要求 二.功能设计 三....四....一....handler基础,网络请求基础,文件操作基础 二....我们要设计一个能下载特定网络文件的小程序,并且能将加载...直接拖拽的,比较简陋的一个布局。 <andr...
  • 搜狗没有啥可以介绍的这里就说一下安装方式移到sogou/sga如果无法启动断网再安装#此处仅以代表性布局为例##更多界面截图请拖拽至文末#Write目前有且仅有RED版。RED+暂不制作,为百度输入法安卓版独有,iOS及讯飞搜狗...
  • BaseRecyclerViewAdapterHelperRecyclerView侧滑菜单,Item拖拽,滑动删除Item,自动加载更多,HeaderView,FooterView,Item分组黏贴-SwipeRecyclerView揭示效果布局-RevealLayout优雅地处理加载中,重试,无数据-...
  • UI设计工具droiddrawr1b

    2014-03-03 22:56:06
    非常方便的设计安卓UI,可以通过拖拽进行空间的布局
  • 1.布局管理 ...这几种布局我没有展开说,是因为就是拖拽就可以实现,目前没看到什么好展开讲得东西。 2.常用控件及其事件处理  目前只学到一招,为button等控件增加click的监听。首先我们的activity...
  • 这两个组建的使用十分简单,在eclipse的可视化界面上直接拖拽布局中即可。当用户在事件日期选择器上进行选择之后,需要加将用户的选择读取出来,这需要给组件添加相应的监听器。 一、日期拾取器 1.在eclipse可视...
  • 布局:弹性布局, FlowLayoutPanel控件,它可使控件随着用户拖动窗口的大小而放大缩小,类似安卓中的弹性布局,或者css中的box-sizing。 使用方法:拖拽一个FlowLayoutPanel,里面放你需要的控件。OK 绝对大小(自...
  • 这两个组建的使用十分简单,在eclipse的可视化界面上直接拖拽布局中即可。当用户在事件日期选择器上进行选择之后,需要加将用户的选择读取出来,这需要给组件添加相应的监听器。一、日期拾取器1.在eclipse可视化...
  • 安卓开发的第一步就是在res/layout文件夹下写UI布局(有些用java写的动态布局除外,规则是:当混合使用xml布局文件和代码来控制UI界面时,习惯把变化小,行为较为固定的组件放在xml布局中管理,把那些变化行为多且...

空空如也

空空如也

1 2 3
收藏数 42
精华内容 16
关键字:

安卓拖拽布局