在一个淅淅沥沥的下午,贫道一边品着窖藏了七天的桶装水,一边尝着牙缝里剔出来的肉丝,估计食堂师傅是以吃盐为生的,两三个小时了,还有着一股淡淡的咸味。看着窗外,三三两两的情侣打着伞在雨中漫步。贫道不禁想到了小杜同志的一句顺口溜,"清明时节雨纷纷,天朝剩女欲招婚,借问经男何处有,媒人遥指张江村。"真是一个不错的下午茶。就在贫道沉浸其中之时,只见一个猥琐大叔般的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