利用代码实现Android多分辨率的对应——即一套图片对应多个分辨率

简介: main.xml如下: ViewScaleUtil如下: package cn.

main.xml如下:

<RelativeLayout 
    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"
   >

    <TextView
        android:id="@+id/titleTextView"
        android:layout_width="150px"
        android:layout_height="50px"
        android:text="@string/hello_world"
        android:gravity="center"
        android:background="@android:color/black"
        android:textColor="@android:color/white"
        android:layout_centerHorizontal="true"
     />
    
    <LinearLayout
        android:id="@+id/linearLayout"
        android:layout_width="fill_parent"
        android:layout_height="200px"
        android:layout_marginTop="80px"
        android:orientation="horizontal" >
        <Button
            android:id="@+id/firstButton"
            android:layout_width="150px"
            android:layout_height="100px"
            android:layout_marginLeft="50px"
            android:layout_marginTop="40px"
            android:orientation="horizontal"
            android:text="Button1" />

        <Button
            android:id="@+id/secondButton"
            android:layout_width="150px"
            android:layout_height="100px"
            android:layout_marginLeft="100px"
            android:layout_marginTop="40px"
            android:orientation="horizontal"
            android:text="Button2" />
    </LinearLayout>
    
    <RelativeLayout
        android:id="@+id/relativeLayout"
        android:layout_width="fill_parent"
        android:layout_height="300px"
        android:layout_marginTop="280px" >

        <ImageView
            android:id="@+id/firstImageView"
            android:layout_width="150px"
            android:layout_height="200px"
            android:layout_alignParentLeft="true"
            android:src="@drawable/icon" />
        
         <ImageView
            android:id="@+id/secondImageView"
             android:layout_width="150px"
            android:layout_height="200px"
            android:layout_alignParentRight="true"
            android:src="@drawable/icon" />
    </RelativeLayout>

</RelativeLayout>

ViewScaleUtil如下:

package cn.utils;
import android.app.Activity;
import android.util.DisplayMetrics;
import android.util.TypedValue;
import android.view.View;
import android.widget.TextView;

public class ViewScaleUtil {
	public static float sScale = 1.0f;
	
	public static final int BASE_SCREEN_WIDTH = 480;
	public static final int BASE_SCREEN_HEIGHT = 854;

	public static final int LAYOUT_PARAMS_TYPE_LINEAR_LAYOUT = 0;
	public static final int LAYOUT_PARAMS_TYPE_RELATIVE_LAYOUT = 1;
	public static final int LAYOUT_PARAMS_TYPE_FRAME_LAYOUT = 2;

	public static final int LAYOUT_PARAMS_WIDTH = 0;
	public static final int LAYOUT_PARAMS_HEIGHT = 1;
	public static final int LAYOUT_PARAMS_TOP_MARGIN = 2;
	public static final int LAYOUT_PARAMS_LEFT_MARGIN = 3;
	public static final int LAYOUT_PARAMS_BOTTOM_MARGIN = 4;
	public static final int LAYOUT_PARAMS_RIGHT_MARGIN = 5;
	public static final int LAYOUT_PARAMS_COUNT = 6;
	
	public static void setScale(Activity context) {
		int width, height;
		DisplayMetrics displayMetrics = new DisplayMetrics();
		context.getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
		height = displayMetrics.heightPixels;
		width = displayMetrics.widthPixels;
		sScale = (float) width / BASE_SCREEN_WIDTH;
		System.out.println("---> sScale="+sScale);
	}
	
	
	public static int[] scaleProcess(View view, int paramType) {
		if (view == null || sScale == 1.0f){
			return null;
			}
		int[] orgLayoutParams = new int[LAYOUT_PARAMS_COUNT];
		switch (paramType) {
		case LAYOUT_PARAMS_TYPE_LINEAR_LAYOUT:
			android.widget.LinearLayout.LayoutParams llp
			= (android.widget.LinearLayout.LayoutParams) view.getLayoutParams();
			
			orgLayoutParams[LAYOUT_PARAMS_WIDTH] = llp.width;
			orgLayoutParams[LAYOUT_PARAMS_HEIGHT] = llp.height;
			orgLayoutParams[LAYOUT_PARAMS_TOP_MARGIN] = llp.topMargin;
			orgLayoutParams[LAYOUT_PARAMS_LEFT_MARGIN] = llp.leftMargin;
			orgLayoutParams[LAYOUT_PARAMS_BOTTOM_MARGIN] = llp.bottomMargin;
			orgLayoutParams[LAYOUT_PARAMS_RIGHT_MARGIN] = llp.rightMargin;
			// Size
			if (llp.width > 0){
				llp.width = (int) Math.ceil(llp.width * sScale);
				}
			if (llp.height > 0){
				llp.height = (int) Math.ceil(llp.height * sScale);
				}
			// Margin
			llp.topMargin = (int) Math.ceil(llp.topMargin * sScale);
			llp.leftMargin = (int) Math.ceil(llp.leftMargin * sScale);
			llp.bottomMargin = (int) Math.ceil(llp.bottomMargin * sScale);
			llp.rightMargin = (int) Math.ceil(llp.rightMargin * sScale);
			view.setLayoutParams(llp);
			break;
		case LAYOUT_PARAMS_TYPE_RELATIVE_LAYOUT:
			android.widget.RelativeLayout.LayoutParams 
			rlp = (android.widget.RelativeLayout.LayoutParams) view.getLayoutParams();
			
			orgLayoutParams[LAYOUT_PARAMS_HEIGHT] = rlp.height;
			orgLayoutParams[LAYOUT_PARAMS_TOP_MARGIN] = rlp.topMargin;
			orgLayoutParams[LAYOUT_PARAMS_LEFT_MARGIN] = rlp.leftMargin;
			orgLayoutParams[LAYOUT_PARAMS_BOTTOM_MARGIN] = rlp.bottomMargin;
			orgLayoutParams[LAYOUT_PARAMS_RIGHT_MARGIN] = rlp.rightMargin;
			// Size
			if (rlp.width > 0){
				rlp.width = (int) Math.ceil(rlp.width * sScale);
				}
			if (rlp.height > 0){
				rlp.height = (int) Math.ceil(rlp.height * sScale);
				}
			// Margin
			rlp.topMargin = (int) Math.ceil(rlp.topMargin * sScale);
			rlp.leftMargin = (int) Math.ceil(rlp.leftMargin * sScale);
			rlp.bottomMargin = (int) Math.ceil(rlp.bottomMargin * sScale);
			rlp.rightMargin = (int) Math.ceil(rlp.rightMargin * sScale);
			view.setLayoutParams(rlp);
			break;
		case LAYOUT_PARAMS_TYPE_FRAME_LAYOUT:
			android.widget.FrameLayout.LayoutParams 
			flp = (android.widget.FrameLayout.LayoutParams) view.getLayoutParams();
			orgLayoutParams[LAYOUT_PARAMS_WIDTH] = flp.width;
			orgLayoutParams[LAYOUT_PARAMS_HEIGHT] = flp.height;
			orgLayoutParams[LAYOUT_PARAMS_TOP_MARGIN] = flp.topMargin;
			orgLayoutParams[LAYOUT_PARAMS_LEFT_MARGIN] = flp.leftMargin;
			orgLayoutParams[LAYOUT_PARAMS_BOTTOM_MARGIN] = flp.bottomMargin;
			orgLayoutParams[LAYOUT_PARAMS_RIGHT_MARGIN] = flp.rightMargin;
			// Size
			if (flp.width > 0){
				flp.width = (int) Math.ceil(flp.width * sScale);
				}
			if (flp.height > 0){
				flp.height = (int) Math.ceil(flp.height * sScale);
				}
			// Margin
			flp.topMargin = (int) Math.ceil(flp.topMargin * sScale);
			flp.leftMargin = (int) Math.ceil(flp.leftMargin * sScale);
			flp.bottomMargin = (int) Math.ceil(flp.bottomMargin * sScale);
			flp.rightMargin = (int) Math.ceil(flp.rightMargin * sScale);
			view.setLayoutParams(flp);
			break;
		}

		return orgLayoutParams;
	}


	public static int[] scaleProcessTextView(TextView view, int paramType) {
		if (view == null || sScale == 1.0f){
			return null;
			}
		int[] orgLayoutParams = scaleProcess(view, paramType);
		scaleProcessTextViewTextSize(view);
		return orgLayoutParams;
	}
	

	public static void scaleProcessTextViewTextSize(TextView view) {
		if (view == null || sScale == 1.0f){
			return;
			}
		float size = view.getTextSize();
		size *= sScale;
		view.setTextSize(TypedValue.COMPLEX_UNIT_PX, size);
	}

}

MainActivity如下:

package cn.testviewscaleutil;
import cn.utils.ViewScaleUtil;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
import android.app.Activity;

public class MainActivity extends Activity {
	private TextView mTitleTextView;
	private View mLinearLayout;
	private Button mFirstButton;
	private Button mSecondButton;
	private View mRelativeLayout;
	private ImageView mFirstImageView;
	private ImageView mSecondImageView;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		init();
	}
	private void init(){
		mLinearLayout=findViewById(R.id.linearLayout);
		mTitleTextView=(TextView) findViewById(R.id.titleTextView);
		mLinearLayout=findViewById(R.id.linearLayout);
		mFirstButton=(Button) findViewById(R.id.firstButton);
		mSecondButton=(Button) findViewById(R.id.secondButton);
		mRelativeLayout=findViewById(R.id.relativeLayout);
		mFirstImageView=(ImageView) findViewById(R.id.firstImageView);
		mSecondImageView=(ImageView) findViewById(R.id.secondImageView);
		ViewScaleUtil.setScale(MainActivity.this);
		ViewScaleUtil.scaleProcess(mTitleTextView, ViewScaleUtil.LAYOUT_PARAMS_TYPE_RELATIVE_LAYOUT);
		ViewScaleUtil.scaleProcess(mLinearLayout, ViewScaleUtil.LAYOUT_PARAMS_TYPE_RELATIVE_LAYOUT);
		ViewScaleUtil.scaleProcess(mFirstButton, ViewScaleUtil.LAYOUT_PARAMS_TYPE_LINEAR_LAYOUT);
		ViewScaleUtil.scaleProcess(mSecondButton, ViewScaleUtil.LAYOUT_PARAMS_TYPE_LINEAR_LAYOUT);
		ViewScaleUtil.scaleProcess(mRelativeLayout, ViewScaleUtil.LAYOUT_PARAMS_TYPE_RELATIVE_LAYOUT);
		ViewScaleUtil.scaleProcess(mFirstImageView, ViewScaleUtil.LAYOUT_PARAMS_TYPE_RELATIVE_LAYOUT);
		ViewScaleUtil.scaleProcess(mSecondImageView, ViewScaleUtil.LAYOUT_PARAMS_TYPE_RELATIVE_LAYOUT);
	}
}




 

相关文章
|
14天前
|
安全 Java 网络安全
Android远程连接和登录FTPS服务代码(commons.net库)
Android远程连接和登录FTPS服务代码(commons.net库)
15 1
|
2月前
|
存储 缓存 编解码
Android经典面试题之图片Bitmap怎么做优化
本文介绍了图片相关的内存优化方法,包括分辨率适配、图片压缩与缓存。文中详细讲解了如何根据不同分辨率放置图片资源,避免图片拉伸变形;并通过示例代码展示了使用`BitmapFactory.Options`进行图片压缩的具体步骤。此外,还介绍了Glide等第三方库如何利用LRU算法实现高效图片缓存。
61 20
Android经典面试题之图片Bitmap怎么做优化
|
27天前
|
Android开发 Swift iOS开发
探索安卓与iOS开发的差异:从代码到用户体验
【10月更文挑战第5天】在移动应用开发的广阔天地中,安卓和iOS两大平台各占半壁江山。它们在技术架构、开发环境及用户体验上有着根本的不同。本文通过比较这两种平台的开发过程,揭示背后的设计理念和技术选择如何影响最终产品。我们将深入探讨各自平台的代码示例,理解开发者面临的挑战,以及这些差异如何塑造用户的日常体验。
|
2月前
|
存储 Java Android开发
🔥Android开发大神揭秘:从菜鸟到高手,你的代码为何总是慢人一步?💻
在Android开发中,每位开发者都渴望应用响应迅速、体验流畅。然而,代码执行缓慢却是常见问题。本文将跟随一位大神的脚步,剖析三大典型案例:主线程阻塞导致卡顿、内存泄漏引发性能下降及不合理布局引起的渲染问题,并提供优化方案。通过学习这些技巧,你将能够显著提升应用性能,从新手蜕变为高手。
26 2
|
3月前
|
JSON JavaScript 前端开发
Android调用Vue中的JavaScript代码
Android调用Vue中的JavaScript代码
33 3
|
3月前
|
数据处理 开发工具 数据安全/隐私保护
Android平台RTMP推送|轻量级RTSP服务|GB28181接入之文字、png图片水印的精进之路
本文探讨了Android平台上推流模块中添加文字与PNG水印的技术演进。自2015年起,为了满足应急指挥及安防领域的需求,逐步发展出三代水印技术:第一代为静态文字与图像水印;第二代实现了动态更新水印内容的能力,例如实时位置与时间信息;至第三代,则优化了数据传输效率,直接使用Bitmap对象传递水印数据至JNI层,减少了内存拷贝次数。这些迭代不仅提升了用户体验和技术效率,也体现了开发者追求极致与不断创新的精神。
|
3月前
|
自然语言处理 定位技术 API
Android经典实战之如何获取图片的经纬度以及如何根据经纬度获取对应的地点名称
本文介绍如何在Android中从图片提取地理位置信息并转换为地址。首先利用`ExifInterface`获取图片内的经纬度,然后通过`Geocoder`将经纬度转为地址。注意操作需在子线程进行且考虑多语言支持。
215 4
|
3月前
|
安全 Java 网络安全
Android远程连接和登录FTPS服务代码(commons.net库)
很多文章都介绍了FTPClient如何连接ftp服务器,但却很少有人说如何连接一台开了SSL认证的ftp服务器,现在代码来了。
96 2
|
4月前
|
存储 Java Android开发
🔥Android开发大神揭秘:从菜鸟到高手,你的代码为何总是慢人一步?💻
【7月更文挑战第28天】在Android开发中,每位开发者都追求极致的用户体验。然而,“代码执行慢”的问题时常困扰着开发者。通过案例分析,我们可探索从新手到高手的成长路径。
39 3
|
3月前
|
Java Android开发
Android项目架构设计问题之要提升代码的可读性和管理性如何解决
Android项目架构设计问题之要提升代码的可读性和管理性如何解决
38 0