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

來源:互聯網
上載者:User

在一個淅淅瀝瀝的下午,貧道一邊品著窖藏了七天的桶裝水,一邊嘗著牙縫裡剔出來的肉絲,估計食堂師傅是以吃鹽為生的,兩三個小時了,還有著一股淡淡的鹹味。看著窗外,三三兩兩的情侶打著傘在雨中漫步。貧道不禁想到了小杜同志的一句順口溜,"清明時節雨紛紛,天朝剩女欲招婚,借問經男何處有,媒人遙指張江村。"真是一個不錯的下午茶。就在貧道沉浸其中之時,只見一個猥瑣大叔般的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

 

 

          
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.