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