android开发(13) 尝试在流布局中移动控件

我们常用的linearlayout,等都属于流布局,在流布局中如何移动控件呢? 我决定做个尝试。虽然可以使用绝对布局,但我不倾向使用这个布局。那么看看我的方式吧。

 

记得margin这个属性吗,我们就用来它来控制控件的位置,改动它的值将会产生移动的效果。


 

 

ViewGroup.MarginLayoutParams paras = (ViewGroup.MarginLayoutParams) textView1
                        .getLayoutParams();

                paras.setMargins(paras.leftMargin + 15, paras.topMargin + 15,
                        paras.rightMargin, paras.bottomMargin);
                textView1.requestLayout();

            

 如上面的代码所示,margin的属性存在于 布局参数LayoutParams中。

1。我们先获得该控件的 布局参数 然后转型为ViewGroup.MarginLayoutParams 

2. 更改margin的数值,通过更改 该控件的上下左右偏移量(相对于父容器控件的原点),来更改控件的呈现位置。

3. 调用requestLayout 请求重新布局。

 通过上面的方式,我们可以产生控件移动的效果。

 

--------------

 同时,我们了解下 ScroolBy这个方法,该方法可以产生控件的滚动效果。而看起来移动了该控件的子内容。

 

textView1.scrollBy(15, 15); 
  

 

 该方法需要两个参数,x轴偏移量和y轴偏移量。执行代码后,我们看到产生了 类似 滚动条移动后,控件 上移 的效果。看起来像是重绘了视图内容,而变化了绘制的坐标原点。

类似的还有个scroolTo方法,该方法需要制定目的偏移量。

 

贴完整的示例代码如下:

 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"

xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <LinearLayout
        android:id="@+id/LinearLayout1"
        android:layout_width="fill_parent"
        android:layout_height="200dp"
        android:layout_alignParentTop="true"
        android:background="#426ab3"
        android:orientation="vertical" >

        <TextView
            android:id="@+id/textView1"
            android:layout_width="140dp"
            android:layout_height="60dp"
            android:layout_centerHorizontal="true"
            android:layout_centerVertical="true"
            android:layout_marginLeft="25dp"
            android:background="#ffffff"
            android:gravity="center"
            android:text="控件1"
            tools:context=".MainActivity" />
    </LinearLayout>

    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentRight="true"
        android:orientation="vertical" >

        <Button
            android:id="@+id/button1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="改动marinLeft 控件1" />

        <Button
            android:id="@+id/btnScroll"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="16dp"
            android:text="scrollBy 控件1" />

        <Button
            android:id="@+id/btnScrollTo1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="crollTo 控件1" />

        <Button
            android:id="@+id/btnScrollParent"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="scrollBy  控件1 的父控件" />
    </LinearLayout>

    <TextView
        android:id="@+id/txtState"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_below="@+id/LinearLayout1"
        android:layout_marginLeft="5dp"
        android:layout_marginTop="25dp"
        android:text="info:" />

</RelativeLayout>

 

 package com.example.zyf.demo;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.view.ViewGroup.LayoutParams;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.TextView;

public class MainActivity extends Activity {
    TextView textView1;
    TextView txtState;

    Button btn1;
    Button btnScroll;
    Button btnScrollTo1;

    Button btnScrollParent;
    LinearLayout linearLayout1;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        textView1 = (TextView) findViewById(R.id.textView1);

        linearLayout1 = (LinearLayout) findViewById(R.id.LinearLayout1);


        btn1 = (Button) findViewById(R.id.button1);
        btn1.setOnClickListener(new OnClickListener() {
            public void onClick(View arg0) {
                // textView1.setPadding(textView1.getPaddingLeft()+15,
                
// textView1.getPaddingTop(), textView1.getPaddingRight(),
                
// textView1.getPaddingBottom());
                ViewGroup.MarginLayoutParams paras = (ViewGroup.MarginLayoutParams) textView1
                        .getLayoutParams();

                paras.setMargins(paras.leftMargin + 15, paras.topMargin + 15,
                        paras.rightMargin, paras.bottomMargin);
                textView1.requestLayout();
                //textView1.invalidate();

                PrintfState();
            }
        });

        btnScroll = (Button) findViewById(R.id.btnScroll);
        btnScroll.setOnClickListener(new OnClickListener() {
            public void onClick(View arg0) {
                textView1.scrollBy(15, 15);
                //textView1.requestLayout(); //会导致布局重置 而导致失效
            
                PrintfState();
            }
        });

        btnScrollTo1 = (Button) findViewById(R.id.btnScrollTo1);
        btnScrollTo1.setOnClickListener(new OnClickListener() {
            public void onClick(View arg0) {
                textView1.scrollTo(15, 15);
                PrintfState();
            }
        });

        btnScrollParent = (Button) findViewById(R.id.btnScrollParent);
        btnScrollParent.setOnClickListener(new OnClickListener() {
            public void onClick(View arg0) {
                linearLayout1.scrollBy(15, 15);
                PrintfState();
            }
        });

        txtState = (TextView) findViewById(R.id.txtState);
        
        PrintfState();
    }

    private String GetTextStateOfView(View view, String title) {
        StringBuilder sb = new StringBuilder(title + "的状态:\n");
        sb.append(String.format("ScrollX:%s ,ScrollY:%s", view.getScrollX(),
                view.getScrollY()));
        
        ViewGroup.MarginLayoutParams paras = (ViewGroup.MarginLayoutParams) view
        .getLayoutParams();
        sb.append(String.format("margins: %s,%s,%s,%s", paras.leftMargin,
                paras.topMargin, paras.rightMargin,
                paras.bottomMargin));
        return sb.toString();
    }

    private void PrintfState() {
        String s="";
        s += GetTextStateOfView(linearLayout1, "控件1的父 ");
        s += GetTextStateOfView(textView1, "\n控件1");

        Printf(s);
    }

    private void Printf(String str) {
        txtState.setText(str);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }
}

 

代码下载

 

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/403769.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

阴影 border: 0 0 0 1px #4caaff;

阴影 border: 0 0 0 1px #4caaff;

第一章 处理器体系结构

1.请简述精简指令集RISC和复杂指令集CISC的区别 2.请简述数值 0x123456789 在大小端字节序处理器的存储器中的存储方式 3.请简述在你所熟悉的处理器&#xff08;比如双核Cortex-A9&#xff09;中一条存储读写指令的执行全过程 4.请简述内存屏障&#xff08;memory barrier&am…

Linux双网卡绑定实现

概述&#xff1a;通过网卡绑定&#xff0c;处理网卡单点故障&#xff0c;实验的操作系统是Redhat Linux Enterprise 5.3.绑定的前提条件&#xff1a;芯片组型号相同&#xff0c;而且网卡应该具备自己独立的BIOS芯片。网卡绑定时有四种模式&#xff0c;其中常用的是模式0和模式1…

给element的select添加复选框

需求&#xff1a;要求给select多选的时候&#xff0c;给下拉框前加上复选框样式 element select原样式 需要更改后的样式 html <el-selectv-model"searchObj.knowledgeIds"class"select-box"filterablemultiplecollapse-tagsstyle"margin-left…

TCP选项:TCP_NODELAY和TCP_CORK

From: http://blog.163.com/zhangjie_0303/blog/static/990827062012718316231/ Nagle算法 TCP_NODELAY和TCP_CORK Nagle算法 根据创建者John Nagle命名。该算法用于对缓冲区内的一定数量的消息进行自动连接。该处理过程 (称为Nagling)&#xff0c;通过减少必须发送的封包的…

loop 伪设备 挂在文件系统

dd if/dev/zero of./test.img bs1M count512 losetip /dev/loop1 test.img mkfs.ext3 -L ingben /dev/loop1 dumpe2fs /dev/loop1 tune2fs -l /dev/loo1 mount /dev/loop1 /mnt hexdump -C /dev/loop1 > /dumptext.log1

mysql导入导出数据

用以下命令&#xff0c;导入导出Mysql几百M&#xff0c;几G的数据库都没有问题。注意“--default-character-setutf8”是设置编码的。 1&#xff0c;数据库备份命令&#xff1a; mysqldump -h localhost -u root -p --default-character-setutf8 dbname >backup.sq…

修改复选框样式

//默认input[type"checkbox"] {margin-top: 7px;cursor: pointer;position: relative;width: 14px;height: 14px;font-size: 14px;margin-right: 8px;background-color:#fff;}//选中后修改input[type"checkbox"]::after {position: absolute;top: 0;//修改…

java jni ubuntu 环境搭建时遇到的坑

1&#xff1a;版本不一致遇到的坑 javah的版本需要同javac的版本一致。如果版本的问题搞不定&#xff0c;直接用andorid source build之后的环境即可 2&#xff1a;javah使用遇到的坑 jni中字段描述符可以使用javah生成 javah -jni -classpath . JNIdemo 其中 -classpath…

linux 内核配置过程中遇到的问题

大家都知道在修改内核需要两步 配置和编译 在配置过程中 用到的命令 make config、make menuconfig、make xconfig 前两个是文本界面 最后一个是图形界面 不建议用最后一个 因为占用的资源太多 有点卡 但如果你的硬件配置极高 我也不否定 你来用 转入正题 我在配置时 make menu…

c如何返回数组给java

jintArray c_hello(JNIEnv *env, jobject cls, jintArray arr) { jint a[4]{12,13,14,15}; jintArray arry; arry (*env)->NewIntArray(env,4); (*env)->SetIntArrayRegion(env,arry,0,4,a); return arry; } 实际上也…

JNDI的XML相关配置(context.xml和web.xml)

1. 在tomcat目录下conf/context.xml文件中 加入一下代码   <Resource name"jdbc/sqlconnpool" auth"Container" type"javax.sql.DataSource" driverClassName"com.microsoft.sqlserver.jdbc.SQLServerDriver" …

Vue 作用域插槽

原博出处&#xff1a; 作者&#xff1a;SentMes 链接&#xff1a;SentMes作者书写的作用于插槽链接 https://www.jianshu.com/p/0c9516a3be80 来源&#xff1a;简书 ** ** ** 十分感谢原作者&#xff0c;写的十分详细&#xff0c;原作者辛苦了&#xff01; 深入理解vue中的s…

nuc972的ramfs的配置yaffs2,ubi文件系统

按照技术支持的推荐&#xff0c;使用ramfs文件系统。那么就可以在uboot的nuc970_evb.h中将JEFS yaffs ubi 的相关支持去掉就可以了。这样理应能减少很大部分的uboot大小。剩下就是配置内核中的ramfs配置。 General setup ---> [ ] Initial RAM filesystem and RAM disk (i…

I/O多路复用之epoll

2019独角兽企业重金招聘Python工程师标准>>> 在上一章&#xff0c;我们对select进行了大致的描述&#xff0c;知道了它相对传统的阻塞式服务提高了并发度&#xff0c;但是它也由于轮询而导致效率底下。本文对epoll进行讲解&#xff0c;相比select它的并发度更高&…

关于24点游戏的编程思路与基本算法

From: http://blog.csdn.net/wangqiulin123456/article/details/8145545 24点游戏的算法&#xff0c;其中最主要的思想就是穷举法。所谓穷举法就是列出4个数字加减乘除的各种可能性&#xff0c;包括括号的算法。我们可以将表达式分成以下几种&#xff1a;首先我们将4个数设为a…

Xtreme TaskPanel

原文来自方案网 http://www.fanganwang.com/Product-detail-item-1230.html&#xff0c;欢迎转载。 关键字&#xff1a;TaskPanel Codejock Xtreme TaskPanel为Windows开发者提供了一个非常熟悉的任务栏&#xff0c;与Windows资源管理器类似。该任务面板可以像VS.NET工具一样被…

linux设备驱动之按键外部中断

老习惯先贴一波代码再仔细分析消化。 #include <linux/module.h> #include <linux/kernel.h> #include <linux/fs.h> #include <linux/init.h> #include <linux/delay.h> #include <linux/irq.h> #include <asm/uaccess.h> #includ…

C语言实现ICMP协议Ping命令

From: http://www.360doc.com/content/12/0429/19/1317564_207540510.shtml 大部分人用ping命令只是作为查看另一个系统的网络连接是否正常的一种简单方法。在这篇文章中&#xff0c;作者将介绍如何用C语言编写一个模拟ping命令功能的程序。ping命令是用来查看网络上另一个主机…