編輯:關於Android編程
說起來我也夠菜的!⊙﹏⊙b汗。
今天搞了一個關於圖片的demo,想動態的改變一張圖片的大小和margin值。但是在activity中獲取imageview的寬度和高度的時候,總是0。哎,我tm就是搞不懂了,怎麼能是0呢?
imageView1 = (ImageView) findViewById(R.id.id_img1); int width = imageView1.getWidth(); int height = imageView1.getHeight();
起初懷疑是我代碼寫的有問題,可能寫錯了,可是反復檢查和實驗了幾次,還TM是0。蛋疼!後來上網一查,發現了新大陸了。
在onCreate方法中,控件其實還沒有畫好,也就是說當onCreate方法執行完了之後,才開始繪制控件,所以在onCreate方法中獲取width和height返回的值是0。但是我又想onResume方法是不是可以呢?後來發現還是不行!我自定義了ImageView,然後打印量log日志,發現果然是這樣,onCreate和onResume方法執行完了之後,才開始執行控件的測量(onMeasure)和繪制(onDraw)方法。
MyImageView.java---自定義ImageView類:
public class MyImageView extends ImageView { public MyImageView(Context context) { super(context); } public MyImageView(Context context, AttributeSet attrs) { super(context, attrs); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); Log.i("imageview", "onMeasure..."); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); Log.i("imageview", "onDraw..."); } }activity類:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_demo3); Log.i("imageview", "onCreate....."); } @Override protected void onResume() { super.onResume(); Log.i("imageview", "onResume....."); }打印出來的LOG日志如下:
<喎?/kf/ware/vc/" target="_blank" class="keylink">vcD4KPGgyPr3ivvaw7LeoPC9oMj4KPHA+ICAgILzIyLtvbkNyZWF0Zbe9t6jW0LK70NCjrNOmuMPT0Mbky/u1xLe9t6jBy6Oh09rKx7TTzfjJz9XStb3By8jnz8K8uNbWt723qKOhPC9wPgo8cD4gICAgtdrSu9bWt723qKO6yrnTw0JpdG1hcEZhY3RvcnmhozwvcD4KPHA+PHByZSBjbGFzcz0="brush:java;">Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.songjiang);
Log.i("imageview", "width: " + bitmap.getWidth());
Log.i("imageview", "height: " + bitmap.getHeight());
第二種方法: 使用MeasureSpec.makeMeasureSpec方法。
int w = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED); int h = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED); img.measure(w, h); Log.i("imageview2", "width: " + img.getMeasuredWidth()); Log.i("imageview2", "height: " + img.getMeasuredHeight());第三種方法:使用ViewTreeObserver.addOnPreDrawListener方法。
ViewTreeObserver vto = img.getViewTreeObserver(); vto.addOnPreDrawListener(new OnPreDrawListener() { @Override public boolean onPreDraw() { int height = img.getMeasuredHeight(); int width = img.getMeasuredWidth(); Log.i("imageview3", "width: " + width); Log.i("imageview3", "height: " + height); return true; } });
ViewTreeObserver vto = img.getViewTreeObserver(); vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() { @Override public void onGlobalLayout() { img.getViewTreeObserver().removeGlobalOnLayoutListener(this); Log.i("imageview4", "width: " + img.getWidth()); Log.i("imageview4", "height: " + img.getHeight()); } });
注意:方法三會調用3次。
在代碼中動態改變ImageView的寬高就很簡單了!
DisplayMetrics metrics = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(metrics); int desityDpi = metrics.densityDpi; Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.hi); int width = bitmap.getWidth() * 160 / desityDpi; int height = bitmap.getHeight() * 160 / desityDpi; LayoutParams params = imageView1.getLayoutParams(); params.width = width; params.height = height; imageView1.setLayoutParams(params);
demo代碼此處此處下載!(隨後上傳!)
首先給大家看一下我們今天這個最終實現的效果圖:我這裡只是單純的實現了ListView返回頂部的功能。具體效果大家可以適當地美化在實際項目中可以換圖標,去掉右側滾動條等。具
概述: 我想我們在使用一些App的時候,應該不會出現一些“裸控件”的吧。除非是一些系統中的軟件,那是為了保持風格的一致性,做出的一些權衡。我這裡並
BlueStacks安卓模擬器屏幕窗口大小的調整方法,使用過BlueStacks安卓模擬器的朋友都知道,這款安卓模擬器非常好用,占用資源很少,但是有個缺點是
將自己的編程經歷寫出來是個好習慣先來效果圖:項目結構:1、底部導航底部導航的實現思路,使用button等可點擊控件並置於父布局底部,配合viewpage或fragment