傲嬌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

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM