android设置控件的位置以及获取控件的坐标

项目中遇到一个问题,就是打印机打字的效果,然后找到了一位大神的轮子。Android实用View系列——TextView实现打印机效果
这样确实实现了打印机打字的效果,但是又出现一个问题。这个打印机的自定义View事先不能确定整体的高度,这样,打印机每打印一行,高度就会变大一行,那么在Linear Layout布局中就会影响下边控件的位置。
那么我们就需要在代码中根据字符串的长度设定好FadeInTextView的位置。

1. 获取控件的坐标,找参考坐标:

在activity类中重写onWindowFocusChanged(boolean hasFocus),然后在此方法中调用控件的getLocationOnScreen(int[] location)方法获取参考控件的坐标位置。location参数是一个int型的数组,location[0]代表控件left坐标,location[1]代表控件top的坐标,location[2]代表控件right的坐标,location[3]代表控件bottom的坐标。(单位像素)
调用getLocationOnScreen(int[] location)之后location数组内就会有相应的坐标值。

public class GoodsPagerActivity extends AppCompatActivity {
....
....
     @Override
     public void onWindowFocusChanged(boolean hasFocus) {
        super.onWindowFocusChanged(hasFocus);
        location = new int[2];
        view.getLocationOnScreen(location);
        Log.e("LOCATION",location[0]+"");//打印top坐标
     }
 ...
 ...
 }

2.设置目标控件的坐标:

想要设置控件的坐标位置,就需要先知道屏幕的宽高以及密度(单位像素)

metric = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metric);
// 屏幕宽度(像素)
width = metric.widthPixels;
// 屏幕高度(像素)
height = metric.heightPixels;
// 屏幕密度(0.75 / 1.0 / 1.5)
density = metric.density;
int densityDpi = metric.densityDpi;  // 屏幕密度DPI(120 / 160 / 240)

然后计算字符串的总长度以及所占的行数(单位像素)

        //字符的长度
        int length = str.length();
        //事先设置的字体大小为19sp,根据密度转成像素值
        float textL = length * 19 * density;
        //获取行数
        int line = (int) (textL / (width - 100));
        //计算的到的行数是浮点数转的小数,相当于2.5-->2,那么实际是3行。
        if (textL % (width - 100) > 0) {
            line += 1;
        }

获取了所有数值之后,进行控件坐标的设置:

ViewGroup.MarginLayoutParams margin = new ViewGroup.MarginLayoutParams(view.getLayoutParams());
int top = (int) (refer - 19 * density * 2 - line * 19 * density-(line-1)*15);
//设置位置参数,left,top,right,bottom。
margin.setMargins(50, top, margin.rightMargin + 50, top + margin.height);
RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(margin);
view.setLayoutParams(layoutParams);

这样就可以随意设置控件的位置了

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值