傲娇Android二三事之古古怪怪的Margin

在一个淅淅沥沥的下午,贫道一边品着窖藏了七天的桶装水,一边尝着牙缝里剔出来的肉丝,估计食堂师傅是以吃盐为生的,两三个小时了,还有着一股淡淡的咸味。看着窗外,三三两两的情侣打着伞在雨中漫步。贫道不禁想到了小杜同志的一句顺口溜,"清明时节雨纷纷,天朝剩女欲招婚,借问经男何处有,媒人遥指张江村。"真是一个不错的下午茶。就在贫道沉浸其中之时,只见一个猥琐大叔般的QA,兴高采烈地拿着个平板走了过来,仿佛发现了什么了不起的大事一样,贫道暗暗鄙视了一下。然后只见这厮先是很淡定的把一张图片,从中心位置移到了左上角(见图1)。

图1

贫道不禁用加菲猫打量Woody的眼神又上下打量了大叔一番,靠,你这是来消遣贫道的吗?贫道正要勃然大怒,就在要施出一阳指让他下半辈子成为辉瑞制药的VIP客户时,那厮突然学起谦哥故作神秘起来,就差一句"下面就是见证奇迹的时候"。远处天雷滚滚,不想奇迹却真的出现了,只见图片被移到右下角后,尺寸居然变小了导致图的上半部分消失了(见图2)。"这个平板是道具吗?"贫道顿时有一种想拆这平板的冲动。再看看那张猥琐的笑脸,心里不禁想道"难道是谦哥插足迪宏恋,在娱乐圈混不下去了,化个妆,换个马甲跑到IT界讨生活了?"好吧,本着"己所不欲勿施于人"的祖师遗训,贫道心里默默念道"谦哥,保重",然后转身走回了自己的位置。

图2

回到位置后,贫道奋笔疾书。"代码拷万遍,下笔如有神。"正是此时贫道的生动写照。在一阵行云流水的噼里啪啦声中,整个测试代码一气呵成。

activity_main.xml

<LinearLayout 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"
    android:id="@+id/root"
    tools:context=".MainActivity" >

   
    <ImageView
        android:id="@+id/img" 
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:scaleType="center"
        />
    
</LinearLayout>

MainActivity.java

package com.example.testmargin;


import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.LinearLayout;

public class MainActivity extends Activity {

    ImageView m_imgView = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        LinearLayout l = (LinearLayout) this.findViewById(R.id.root);

        m_imgView = (ImageView)l.findViewById(R.id.img);
        m_imgView.setImageResource(R.drawable.car);
        
        //moveHintsImage(100,100);
        
        l.setOnTouchListener(new View.OnTouchListener() {
            
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                // TODO Auto-generated method stub
                if(event.getActionMasked() == MotionEvent.ACTION_DOWN){
                    moveHintsImage((int)event.getX(),(int)event.getY());
                }
                return true;
            }
        });

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }

    void moveHintsImage(int x, int y) {

        ViewGroup.MarginLayoutParams mp = new ViewGroup.MarginLayoutParams(
                ViewGroup.MarginLayoutParams.WRAP_CONTENT, ViewGroup.MarginLayoutParams.WRAP_CONTENT);
        
        mp.setMargins(x, y, 0,0);
        LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(mp);
        m_imgView.setLayoutParams(params);

    }

}

当敲击完最后一个Enter键后,贫道不禁抚髯感叹道:"梅花香自苦寒来。"此时雨后的斜阳将贫道的身影衬托的无比高大,仿佛武侯附体。

此时的贫道志得意满的把手放在了平板上,然后把图片移向右下角,准备戳穿QA大叔的把戏。但是奇迹又出现了。贫道顿时头上一顿黑线,为啥是个又字。而此刻图片也与QA的结果一样缩小了。看来变魔法的不是猥琐大叔般的QA,而是开发此部分代码的Google镇码农。太史公曾曰:“Coder者,魔术师也。”古人不曾欺我也。

在扫描了整个代码后,贫道首先把疑点聚焦在了ViewGroup.MarginLayoutParams.WRAP_CONTENT上。WRAP_CONTENT者,随便也。就是图多大,我也多大,随你的便。估计就是这个原因,在图移到右下角时,随便整了个大小。这时贫道立马重新修改了下moveHintsImage函数里的代码,把ViewGroup.MarginLayoutParams.WRAP_CONTENT换成了图的真实宽高值。

MainActivity.java

void moveHintsImage(int x, int y) {

        ViewGroup.MarginLayoutParams mp = new ViewGroup.MarginLayoutParams(535, 535);
        mp.setMargins(x, y, 0,0);
        LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(mp);
        m_imgView.setLayoutParams(params);

 }

 又是一阵噼里啪啦的操作后,贫道终于也体会到了,二师兄那句“老婆,快出来看上帝”的无奈与悲凉。而此时旁边的同事的手机里传出了退休大妈们最爱的街舞歌曲“伤不起”。难道Android真的这样伤不起。就在贫道万念俱灰之时,mp.setMargins(x, y, 0,0)映入了贫道的眼帘。俗话说的好,天下没有无缘无故的爱,也没有只打酱油不出力的参数。setMargins函数的后两个参数right,bottom一直被贫道忽略了。而图片变小正是由于图片的bottom或right超出了父窗口(就是此例当中的LinearLayout,参见activity_main.xml)的bottom或right,然而我们设的bootm ,right的Margin是0,为了符合设置的规则,图片的bottom或者right要缩成父窗口的bottom或right,进而导致ImageView尺寸变小,又因为ImageView的ScaleType为center,所以取了图片中部位置显示(因为图片尺寸大于ImageView尺寸),最后导致了图片显示不全(见图2)。同理如果ImageView的ScaleType是fitCenter,则图片移到右下角时,变成缩小的完整图片(见图3)。

图3

所以bottom和rihgt的Margin也需要计算后设置到setMargins函数里,在重新改写了代码以后,

MainActivity.java

 

void moveHintsImage(int x, int y) {

        ViewGroup.MarginLayoutParams mp = new ViewGroup.MarginLayoutParams(
                ViewGroup.MarginLayoutParams.WRAP_CONTENT, ViewGroup.MarginLayoutParams.WRAP_CONTENT);
        LinearLayout l = (LinearLayout) this.findViewById(R.id.root);
        mp.setMargins(x, y, l.getWidth()-(x+m_imgView.getWidth()), l.getHeight()-(y+m_imgView.getHeight()));
        LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(mp);
        m_imgView.setLayoutParams(params);

}

终于翘首以盼的结果,出现在了众人面前(见图4)

图4

傲娇的Android再一次低下了高傲的头,而此时贫道则燃香祈祷那位写setMargins函数的码农做一辈子的男魔法师吧。

 

<<上一篇:傲娇Android二三事之天不长地不久的Bitmap.compress

 

 

posted on 2013-04-01 09:10  樱桃小锤子  阅读(7475)  评论(3编辑  收藏  举报