精华内容
下载资源
问答
  • 安卓自定义控件 - 进度条.创建自定义进度条控件,只需为进度条提供两张纹理图像(一张为背景,一张用于显示进度)

    效果图:



    素材:




    package com.example.progressbar;
    
    import android.app.Activity;
    import android.os.Bundle;
    
    
    public class MainActivity extends Activity
    {
    	protected void onCreate(Bundle savedInstanceState)
    	{
    		super.onCreate(savedInstanceState);
    		
    		// 创建进度条
    		progressView progress = new progressView(this, R.drawable.progress1, R.drawable.progress2);
    		progress.setProgress(77.1f);
    		
    		// 添加进度条到界面显示
    		setContentView(progress);
    	}
    }


    /**
     * 2015-8-25上午11:04:08
     * wangzhongyuan
     */
    
    package com.example.progressbar;
    
    import android.content.Context;
    import android.content.res.Resources;
    import android.graphics.Bitmap;
    import android.graphics.BitmapFactory;
    import android.graphics.Canvas;
    import android.graphics.Color;
    import android.graphics.Rect;
    import android.util.AttributeSet;
    import android.view.Gravity;
    import android.view.View;
    import android.widget.RelativeLayout;
    import android.widget.TextView;
    
    
    /**
     * progressView 创建自定义进度条控件,只需为进度条提供两张纹理图像(一张为背景,一张用于显示进度)
     * -----
     * 2015-8-25 上午11:04:08 
     * wangzhongyuan
     */
    public class progressView extends RelativeLayout
    {
    	// 界面需要的图片
    	private Bitmap progressBack;	// 背景
    	private Bitmap progressfront;	// 进度
    	
    	public float progress = 63;		// 进度值
    	private TextView textView;		// 用于显示进度信息
    	
    	/**
    	 * 设置进度条的显示进度
    	 */
    	public void setProgress(float progress)
    	{
    		if (progress > 100)
    			this.progress = 100;
    		else if (progress < 0)
    			this.progress = 0;
    		else
    			this.progress = progress;
    		
    		textView.setText(this.progress + " %");	// 更新显示信息
    	}
    	
    	/**
    	 * 使用默认资源图像创建进度条
    	 */
    	public progressView(Context context)
    	{
    		super(context);
    		ViewInit(context, R.drawable.progress1, R.drawable.progress2);
    	}
    	
    	/**
    	 * 使用默认资源图像创建进度条, -XML布局创建控件时,会调用该函数
    	 */
    	public progressView(Context context, AttributeSet attrs)
    	{
    		super(context, attrs);
    		ViewInit(context, R.drawable.progress1, R.drawable.progress2);
    	}
    	
    	/**
    	 * 创建进度条,progress1和progress2为尺寸相同的图像
    	 * @param context
    	 * @param drawableID1	进度条背景图		R.drawable.progress1
    	 * @param drawableID2	进度条进度填充图	R.drawable.progress2
    	 */
    	public progressView(Context context, int drawableID1, int drawableID2)
    	{
    		super(context);
    		ViewInit(context, drawableID1, drawableID2);
    	}
    	
    	// 进度条控件初始化
    	private void ViewInit(Context context, int progress1, int progress2)
    	{
    		// 创建InnerView控件
    		InnerView innerView = new InnerView(context, progress1, progress2);
    		
    		// 创建进度条进度信息
    		textView = new TextView(context);
    		textView.setTextSize(innerView.height / 3);	// 设置字体大小
    		textView.setGravity(Gravity.CENTER);		// 居中于TextView
    		textView.setText(progress + " %");			// 设置进度信息
    		textView.setTextColor(Color.WHITE);			// 设置字体颜色
    		
    		// 控件主体部分为
    		RelativeLayout body = new RelativeLayout(context);
    		this.addView(body, centerLayout(innerView.width, innerView.height));
    		
    		// 添加进度条图像控件 和 进度信息到控件上
    		body.addView(innerView);
    		body.addView(textView, centerLayout(innerView.width, innerView.height));	// 居中于当前控件,显示进度信息
    	}
    	
    	// 获取居中布局参数
    	private RelativeLayout.LayoutParams centerLayout(int width, int height)
    	{
    		RelativeLayout.LayoutParams params1 = new RelativeLayout.LayoutParams(width, height);
    		params1.addRule(RelativeLayout.CENTER_IN_PARENT, RelativeLayout.TRUE);
    		
    		return params1;
    	}
    	
    	// 内部类,重写View的onDraw函数,实现进度条的绘制
    	private class InnerView extends View
    	{
    		public int width = 0, height = 0;	// 进度条的尺寸
    				
    		/**
    		 * 创建进度条,progress1和progress2为尺寸相同的图像
    		 * @param context
    		 * @param progress1	进度条背景图		R.drawable.progress1
    		 * @param progress2	进度条进度填充图	R.drawable.progress2
    		 */
    		public InnerView(Context context, int progress1, int progress2)
    		{
    			super(context);
    			ViewInit(context, progress1, progress2);
    		}
    		
    		// 转盘控件自身的初始化
    		private void ViewInit(Context context, int progress1, int progress2)
    		{
    			Resources r = context.getResources();
    			
    			// 从内部资源文件获取进度条图像
    			progressBack = BitmapFactory.decodeStream(r.openRawResource(progress1));
    			progressfront = BitmapFactory.decodeStream(r.openRawResource(progress2));
    			
    			width = progressBack.getWidth();
    			height = progressBack.getHeight();
    		}
    		
    		// 重写View类的onDraw()函数
    		protected void onDraw(Canvas canvas)
    		{
    			// 绘制进度条背景图
    			canvas.drawBitmap(progressBack, 0, 0, null);
    			
    			// 绘制进度条进度图
    			int w = (int) (width * progress / 100);
    			Rect srcRect = new Rect(0, 0, width, height);
    			Rect desRect = new Rect(0, 0, w, height);
    			canvas.drawBitmap(progressfront, srcRect, desRect, null);
    		}
    	}
    }
    



    打包下载: http://download.csdn.net/detail/scimence/9046317


    展开全文
  • 安卓自定义控件(循环Gallery),创建Gallery控件,可实现所有显示图像的循环切换


    创建Gallery控件,可实现所有显示图像的循环切换



    源码下载http://download.csdn.net/detail/scimence/9027453


    package com.sci.circulargallary;
    
    import android.app.Activity;
    import android.os.Bundle;
    
    
    public class MainActivity extends Activity
    {
    	@Override
    	protected void onCreate(Bundle savedInstanceState)
    	{
    		super.onCreate(savedInstanceState);
    		// setContentView(R.layout.activity_main);
    		
    		// 从图像资源创建循环Gallery,并添加至当前Activity中
    		int[] pics = { R.drawable.pic1, R.drawable.pic2, R.drawable.pic3, R.drawable.pic4, R.drawable.pic5, R.drawable.pic6, R.drawable.pic7 };
    		setContentView(new CircularGallery(this, pics));
    	}
    }
    


    /**
     * 2015-8-19下午3:32:21
     * wangzhongyuan
     */
    
    package com.sci.circulargallary;
    
    import android.content.Context;
    import android.graphics.Color;
    import android.view.Gravity;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.AdapterView;
    import android.widget.AdapterView.OnItemClickListener;
    import android.widget.AdapterView.OnItemSelectedListener;
    import android.widget.BaseAdapter;
    import android.widget.Gallery;
    import android.widget.ImageView;
    import android.widget.RelativeLayout;
    import android.widget.Toast;
    
    
    /**
     * CircularGallery 循环Gallery,包含n张子图像,显示为2n张子图,在【0.5n, 1.5n】循环切换
     * -----
     * 2015-8-19 下午3:32:21 
     * wangzhongyuan
     */
    public class CircularGallery extends RelativeLayout
    {
    	private Context context;		// 控件所处的上下文环境
    	private Gallery gallery;
    	private ImageAdapter adapter;
    	private int select;				// 记录当前选中的子图像索引
    	
    	private int[] pics;
    	
    	/**
    	 * 获取当前选中的子控件id = [0, pics.length)
    	 */
    	public int selected()
    	{
    		return select;
    	}
    	
    	/**
    	 * 选中子控件变动时调用该函数,子类可重写该函数,执行子控件选项变动逻辑
    	 */
    	public void selecteChanged()
    	{
    		// if(selected() == 0) ...;
    		// else if(selected() == 1) ...;
    	}
    	
    	/**
    	 * 创建循环Gallery
    	 * pics = { R.drawable.pic1, R.drawable.pic2, R.drawable.pic3, R.drawable.pic4, R.drawable.pic5};
    	 */
    	public CircularGallery(Context context, int[] pics)
    	{
    		super(context);
    		this.context = context;
    		this.pics = pics;
    		
    		creatMainView();
    	}
    	
    	// 创建CircularImageView的子控件,以代码布局的方式显示PicId对应的图像
    	private void creatMainView()
    	{
    		int space = 5;									// 子图像之间的间隔
    		int w2 = 160, h2 = 220;							// CircularGallery中展示的图像大小
    		int w = w2 * 5 + space * 6, h = h2 + space * 2;	// CircularGallery整体大小
    		
    		// 控件主体部分
    		RelativeLayout body = new RelativeLayout(context);	// 创建一个相对布局的视图
    		body.setBackgroundColor(Color.GRAY);				// 为其设置背景色
    		
    		// 添加主体部分到主界面
    		RelativeLayout.LayoutParams paramsBody = new RelativeLayout.LayoutParams(w, h);
    		paramsBody.addRule(RelativeLayout.CENTER_IN_PARENT, RelativeLayout.TRUE);
    		this.addView(body, paramsBody);
    		
    		// 添加Gallery到
    		gallery = new Gallery(context);
    		RelativeLayout.LayoutParams parms = new RelativeLayout.LayoutParams(w, h2);
    		parms.addRule(RelativeLayout.CENTER_IN_PARENT, RelativeLayout.TRUE);
    		body.addView(gallery, parms);
    		
    		adapter = new ImageAdapter(context, pics, w2, h2);
    		gallery.setAdapter(adapter); 					// gallery添加ImageAdapter图片资源
    		gallery.setGravity(Gravity.CENTER_HORIZONTAL); 	// 设置水平居中显示
    		gallery.setSelection(pics.length);				// 设置起始图片显示位置(可以用来制作gallery循环显示效果)
    		gallery.setUnselectedAlpha(0.3f); 				// 设置未选中图片的透明度
    		gallery.setSpacing(5); 							// 设置图片之间的间距
    		
    		gallery.setOnItemClickListener(new OnItemClickListener()
    		{
    			@Override
    			public void onItemClick(AdapterView<?> parent, View view, int position, long id)
    			{
    //				Toast.makeText(context, "图片 " + position, Toast.LENGTH_SHORT).show();
    				
    				//记录选择的图像索引
    				select = position;
    				if(select >= pics.length) select -= pics.length;	
    				Toast.makeText(context, "图片 " + select, Toast.LENGTH_SHORT).show();
    			}
    		});
    		
    		gallery.setOnItemSelectedListener(new OnItemSelectedListener()
    		{
    			@Override
    			public void onItemSelected(AdapterView<?> parent, View view, int position, long id)
    			{
    				int len = pics.length;
    				
    				// 使得所有的图像在[0.5, 1.5)*len之间,无限循环切换
    				int first = len / 2, last = first + len;
    				while (position < first)
    					position += len;
    				while (position >= last)
    					position -= len;
    				
    				gallery.setSelection(position);
    //				adapter.notifyDataSetChanged();
    				
    				//记录选择的图像索引
    				select = position;
    				if(select >= len) select -= len;	
    				
    				selecteChanged();
    			}
    			
    			@Override
    			public void onNothingSelected(AdapterView<?> parent)
    			{}
    		});
    	}
    	
    	/**
    	 * ImageAdapter 用于获取子图像
    	 * -----
    	 * 2015-8-13 上午11:34:51 
    	 * wangzhongyuan
    	 */
    	class ImageAdapter extends BaseAdapter
    	{
    		private Context context;
    		public int[] pics;			// 子图像资源id
    		int W, H;					// 子图像尺寸
    				
    		public ImageAdapter(Context context, int[] pics, int w, int h)
    		{
    			this.context = context;
    			this.pics = pics;
    			W = w;
    			H = h;
    		}
    		
    		// 子图像总数
    		public int getCount()
    		{
    			return pics.length * 2;	// 在Gallery中设置2倍图片数组长度的图像,用于循环显示图像信息
    		}
    		
    		// 获取图片位置
    		public Object getItem(int index)
    		{
    			return pics[index];
    		}
    		
    		// 获取图片ID
    		public long getItemId(int index)
    		{
    			return index;
    		}
    		
    		// 获取index对应的子View
    		public View getView(int index, View convertView, ViewGroup parent)
    		{
    			ImageView imageView = new ImageView(context);
    			imageView.setImageResource(pics[index % pics.length]);
    			
    			imageView.setLayoutParams(new Gallery.LayoutParams(W, H));
    			imageView.setScaleType(ImageView.ScaleType.FIT_XY);
    			return imageView;
    		}
    	}
    }
    





    展开全文
  • 安卓学习笔记23:常用控件 - 网格视图与图像切换器 零、学习目标 了解网格视图常用属性 学会网格视图的基本使用 掌握图像切换器的基本使用 一、网格视图 (一)概述 GridView(网格视图),见名知义,ListView是列表...

    安卓学习笔记23:常用控件 - 网格视图与图像切换器

    零、学习目标
    了解网格视图常用属性
    学会网格视图的基本使用
    掌握图像切换器的基本使用
    一、网格视图
    (一)概述
    GridView(网格视图),见名知义,ListView是列表, GridView就是显示网格!GridView和ListView一样是AbsListView的子类!很多东西和ListView都是相通的。
    (二)继承关系图
    在这里插入图片描述

    (三)常用属性
    android:columnWidth:设置列的宽度
    android:gravity:组件对其方式
    android:horizontalSpacing:水平方向每个单元格的间距
    android:verticalSpacing:垂直方向每个单元格的间距
    android:numColumns:设置列数
    android:stretchMode:设置拉伸模式
    – none:不拉伸
    – spacingWidth:拉伸元素间的间隔空隙
    – columnWidth:仅仅拉伸表格元素自身
    – spacingWidthUniform:既拉元素间距又拉伸它们之间的间隔空隙
    二、图像切换器
    (一)概述
    ImageSwitcher继承了ViewSwitcher,因此它具有与ViewSwitcher相同的特征:可以在切换View组件时使用动画效果。ImageSwitcher继承了ViewSwitcher,并重写了ViewSwitcher的showNext()、showPrevious()方法,因此ImageSwitcher使用起来更加简单。使用ImageSwitcher只要如下两步即可。
    为ImageSwitcher提供一个ViewFactory,该ViewFactory生成的View组件必须是ImageSwitcher。
    需要切换图片时,只要调用ImageSwitcher的setImageDrawable(Drawable drawable)、setImageResource(int resid)和setImageURI(Uri uri)方法更换图片即可。
    ImageSwitcher与ImageView的功能有点相似,它们都可用于显示图片,区别在于ImageSwitcher的效果更炫,它可以指定图片切换时的动画效果。
    (二)继承关系图
    在这里插入图片描述

    三、案例演示 - 选择水果
    (一)运行效果
    在这里插入图片描述

    (二)涉及知识点
    文本视图(TextView)
    网格视图(GridView)
    图像切换器(ImageSwitcher)
    图像视图(ImageView)
    简单适配器(SimpleAdapter)
    数组列表(ArrayList)
    哈希映射(HashMap)
    (三)实现步骤
    1、创建安卓应用【SelectFruit】
    在这里插入图片描述
    在这里插入图片描述

    2、将图片素材拷贝到drawable目录
    在这里插入图片描述

    3、主布局资源文件activity_main.xml
    在这里插入图片描述

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@drawable/background"
    android:gravity="center_horizontal"
    android:orientation="vertical"
    android:padding="10dp">
    <LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginLeft="5dp"
    android:gravity="center_vertical"
    android:orientation="horizontal">
    
    <TextView
    android:id="@+id/tvSwitchMode"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/switch_mode"
    android:textColor="#000000"
    android:textSize="20sp" />
    
    <RadioGroup
    android:id="@+id/rgSwitchMode"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="horizontal">
    
    <RadioButton
    android:id="@+id/rbFadeInOut"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:checked="true"
    android:text="@string/fade_in_out"
    android:textColor="#0000ff"
    android:textSize="20sp" />
    
    <RadioButton
    android:id="@+id/rbSlideInOut"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/slide_in_out"
    android:textColor="#0000ff"
    android:textSize="20sp" />
    </RadioGroup>
    </LinearLayout>
    
    <!-- 图像切换器,设置淡入淡出效果 -->
    <ImageSwitcher
    android:id="@+id/isFruit"
    android:layout_width="250dp"
    android:layout_height="250dp"
    android:layout_marginBottom="20dp"
    android:inAnimation="@android:anim/fade_in"
    android:outAnimation="@android:anim/fade_out" />
    
    <!-- 网格视图,设置为4列 -->
    <GridView
    android:id="@+id/gvFruit"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:columnWidth="20dp"
    android:numColumns="4">
    </GridView></LinearLayout>
    

    4、网格项模板fruit_grid_item.xml
    在这里插入图片描述

    <?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center"
    android:orientation="vertical" >
    
    <ImageView
    android:id="@+id/ivFruit"
    android:layout_width="60dp"
    android:layout_height="60dp"
    android:src="@drawable/img1" />
    
    <TextView
    android:id="@+id/tvLabel"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" /></LinearLayout>
    

    5、字符串资源文件strings.xml
    在这里插入图片描述

    <resources>
    <string name="app_name">选择水果(网格视图 - 图像切换器)</string>
    <string name="switch_mode">图像切换模式:</string>
    <string name="fade_in_out">淡入淡出</string>
    <string name="slide_in_out">左进右出</string></resources>
    

    6、主界面类 - MainActivity
    在这里插入图片描述

    声明变量
    在这里插入图片描述

    通过资源标识符获取控件实例
    在这里插入图片描述

    初始化图像标识符数组
    在这里插入图片描述

    获取水果列表作为数据源
    在这里插入图片描述

    创建简单适配器
    在这里插入图片描述

    网格控件设置适配器
    在这里插入图片描述

    给切换模式单选按钮组注册监听器
    在这里插入图片描述

    设置图像切换器的视图工厂
    在这里插入图片描述

    设置图像切换器的初始图像
    在这里插入图片描述

    网格设置项目单击事件监听器
    在这里插入图片描述

    网格设置项目选择事件监听器
    在这里插入图片描述

    查看源代码

    package net.hw.select_fruit;
    
    import android.os.Bundle;import android.view.View;import android.widget.AdapterView;import android.widget.FrameLayout;import android.widget.GridView;import android.widget.ImageSwitcher;import android.widget.ImageView;import android.widget.RadioGroup;import android.widget.SimpleAdapter;import android.widget.ViewSwitcher;
    
    import androidx.appcompat.app.AppCompatActivity;
    
    import java.util.ArrayList;import java.util.HashMap;import java.util.List;
    
    public class MainActivity extends AppCompatActivity {
    
    private GridView gvFruit; // 水果网格控件
    private ImageSwitcher isFruit; // 水果图像切换器
    private int[] imgIds; // 图像标识符数组
    private final int IMG_COUNT = 16; // 图像总数
    private SimpleAdapter adapter; // 简单适配器
    private List<HashMap<String, Object>> fruits; // 水果列表
    private RadioGroup rgSwitchMode; // 图像切换模式单项按钮组
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    // 利用布局资源文件设置用户界面
    setContentView(R.layout.activity_main);
    
    // 通过资源标识符获取控件实例
    gvFruit = findViewById(R.id.gvFruit);
    isFruit = findViewById(R.id.isFruit);
    rgSwitchMode = findViewById(R.id.rgSwitchMode);
    
    // 初始化图像标识符数组
    imgIds = new int[IMG_COUNT];
    for (int i = 0; i < IMG_COUNT; i++) {
    imgIds[i] = getResources().getIdentifier("img" + (i + 1),
    "drawable", "net.hw.select_fruit");
    }
    
    // 获取水果列表作为数据源
    fruits = getFruits();
    
    // 创建简单适配器
    adapter = new SimpleAdapter(this, // 上下文
    fruits, // 数据源(水果列表)
    R.layout.fruit_grid_item, // 网格项模板
    new String[] { "ivFruit", "tvLabel" }, // 数据源字段名数组
    new int[] { R.id.ivFruit, R.id.tvLabel} // 控件资源标识
    );
    
    // 网格控件设置适配器
    gvFruit.setAdapter(adapter);
    
    // 给切换模式单选按钮组注册监听器
    rgSwitchMode.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
    
    @Override
    public void onCheckedChanged(RadioGroup group, int checkedId) {
    // 根据切换模式设置图像切换器的动画效果
    switch (checkedId) {
    case R.id.rbFadeInOut:
    isFruit.setInAnimation(MainActivity.this, android.R.anim.fade_in);
    isFruit.setOutAnimation(MainActivity.this, android.R.anim.fade_out);
    break;
    case R.id.rbSlideInOut:
    isFruit.setInAnimation(MainActivity.this, android.R.anim.slide_in_left);
    isFruit.setOutAnimation(MainActivity.this, android.R.anim.slide_out_right);
    break;
    }
    }
    });
    
    // 设置图像切换器的视图工厂
    isFruit.setFactory(new ViewSwitcher.ViewFactory() {
    
    @Override
    public View makeView() {
    ImageView image = new ImageView(MainActivity.this);
    // 设置缩放类型
    image.setScaleType(ImageView.ScaleType.FIT_CENTER);
    // 设置布局参数(注意要导入FrameLayout.LayoutParams)
    image.setLayoutParams(new FrameLayout.LayoutParams(
    FrameLayout.LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.WRAP_CONTENT));
    return image;
    }
    });
    
    // 设置图像切换器的初始图像
    isFruit.setImageResource(imgIds[0]);
    
    // 网格设置项目单击事件监听器
    gvFruit.setOnItemClickListener(new AdapterView.OnItemClickListener() {
    
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
    // 设置图像切换器的图像源
    isFruit.setImageResource(imgIds[position]);
    }
    });
    
    // 网格设置项目选择事件监听器
    gvFruit.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
    
    @Override
    public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
    // 设置图像切换器的图像源
    isFruit.setImageResource(imgIds[position]);
    }
    
    @Override
    public void onNothingSelected(AdapterView<?> parent) {
    }
    });
    }
    
    /**
    * @return 水果列表
    */
    private List<HashMap<String, Object>> getFruits() {
    List<HashMap<String, Object>> fruits = new ArrayList<HashMap<String, Object>>();
    
    for (int i = 0; i < IMG_COUNT; i++) {
    HashMap<String, Object> fruit = new HashMap<String, Object>();
    fruit.put("ivFruit", imgIds[i]);
    fruit.put("tvLabel", "No. " + (i + 1));
    fruits.add(fruit);
    }
    
    return fruits;
    }}
    

    7、启动应用,查看效果
    在这里插入图片描述

    展开全文
  • 学习目标01知识目标掌握图片控件02能力目标会使用图片控件图片控件什么是图片控件图片控件用于在屏幕中显示任何Drawable对象通常用来显示图片在...图片控件使用ImageView组件显示图像时通常可以将要显示的图片放置在res
  • 前一天学习了ImageView控件切换显示图像、设置图像透明度以及显示局部的方法。通过setImageBitmap()方法可以快速没有停顿地将图像在控件中显示;通过setAlpha()方法设置图像的透明度;通过为ImageView控件添加触摸...

    前一天学习了ImageView控件切换显示图像、设置图像透明度以及显示局部的方法。通过setImageBitmap()方法可以快速没有停顿地将图像在控件中显示;通过setAlpha()方法设置图像的透明度;通过为ImageView控件添加触摸事件监听器的方法实现位图的局部显示。

    在前面的学习中,通过界面构造文件设置控件尺寸时,可以将其宽度或高度设置为“wrap_content”、“match_parent”等值,也可以将其设置为固定的值,如

    button.layout_width = “120px”

    button.layout_width = “160dp”

    那么,指定控件尺寸时,px、pd这些单位的含义是什么呢?

    在界面布局文件中指定控件尺寸时,可以使用px、pt、dp和sp等单位。

    1 尺寸单位的含义

    1.1 px

    px是pixel的缩写,即像素。像素是屏幕中可以显示的最小元素单元。大家比较熟悉的设置电脑分辨率的1024*768指的就是屏幕宽度为1024个像素,高度为768个像素。以下代码

    button.layout_width = “120px”

    表示按键的宽度时120个像素。

    1.2 pt

    pt是point的缩写,即“点”。它是一个标准的长度单位,1pt=1/72英寸,一般用于印刷业。

    1.3 dp

    dp是density independent pixel的缩写,即“与密度无关的像素”,有时dp也会写成dip。“密度”的概念将在4.1中详细讲解。不同的设备其分辨率可能会不同,使用dp作为尺寸单位可以使得控件在不同设备上显示一样的大小。

    1.4 sp

    sp是scale independent pixel的缩写,即“与放缩无关的像素”。一般用于指定字体。

    2 px和pt的局限性

    在1中提到,px随着设备分别率的不同,会显示不同的尺寸。使用px作为尺寸单位的控件,在分辨率不同的设备中显示的大小是不同的,如图2-1和图2-2所示。其中,图2-1是分辨率为240*320的设备,图2-2是分辨率为480*800的设备。


    图2-1 分辨率为240*320的设备


    图2-2 分辨率为480*800的设备

    而使用pt作为控件尺寸的单位也存在类似问题,对于不同尺寸的设备,其显示的大小是不同的。

    3 与设备无关的单位dp

    在1中提到,dp的含义是与设备无关。使用dp作为控件尺寸的长度,可以使得控件在不同的分辨率下,显示的大小是相同的,如图3-1和3-2所示。其中,图3-1是分辨率为240*320的设备,图3-2是分辨率为480*800的设备。


    图3-1分辨率为240*320的设备


    图3-2分辨率为480*800的设备

    4 pt、dp和sp转换为px

    pt的单位是英寸,px的单位是像素,那么英寸与像素之间是什么关系呢?这就要引入屏幕像素密度的概念了。

    4.1 屏幕像素密度

    屏幕像素密度指的是每英寸包含的像素数量,单位是dpi。查看设备屏幕像素分辨率的代码如下所示:

    1       float xdpi =getResources().getDisplayMetrics().xdpi;

    2       float ydpi =getResources().getDisplayMetrics().ydpi;

    3       float density =getResources().getDisplayMetrics().density;

    4       int default_density =

    5                   getResources().getDisplayMetrics().DENSITY_DEFAULT;

    6       float scale_density =

    7                   getResources().getDisplayMetrics().scaledDensity;

    8       Log.d("MainActivity", "xdpi " + xdpi);

    9       Log.d("MainActivity", "ydpi " + ydpi);

    10      Log.d("MainActivity", "density " + density);

    11      Log.d("MainActivity", "scaleDensity " + scale_density);

    12      Log.d("MainActivity", "DENSITY_DEFAULT " + default_density);

    其中,getResources()是Activity类的方法,获取应用程序包的资源实例,返回值是Resources类;getDisplayMetrics()是Resources类的方法,获取程序的显示信息,返回值是DisplayMetrics类。第1行和第2行中的xdpi和ydpi是DisplayMetrics类的字段,分别表示x轴和y轴方向每英尺的像素数;第3行中的density表示dp的放大因子,其值为xdpi/DENSITY_DEFAULT,DENSITY_DEFAULT是默认的密度值,为160,如第4-5行所示;第6-7行的scaledDensity是sp的放大因子;第8-12行通过调试信息显示获取到的五个值,如图4-1和图4-2所示。其中图4-1是240*320分辨率的设备,图4-2位480*800分辨率的设备。


    图4-1 分辨率为240*320的设备


    图4-2 分辨率为400*800的设备

    4.2 pt转换为px

    DisplayMetrics类的xdpi字段表示每英尺包含的像素数,而1pt等于1/72像素,所以1pt等于xdpi/72个像素。

    4.3 dp转换为px

    DisplayMetrics类的density字段是dp的放大因子,所以1dp等于density个像素。

    4.4 sp转换为px

    DisplayMetrics类的scaleDensity字段是sp的放大因子,所以1dp等于scaleDensity个像素。

    5 小结

    今天学习了表示控件尺寸时所使用的px、pt、dp和sp等单位。其中px表示像素,pt表示点,dp表示与密度无关的像素,sp表示放大因子像素。将pt、dp和sp转换px时,需要用到DisplayMetrics类的xdpi、density和scaleDensity等字段。

    展开全文
  • Android系统控件Button是一种按钮控件,用户能够在该控件上点击,并后引发相应的事件处理方法;ImageButton用以实现能够显示图像功能的控件按钮。
  • 在前一天中我们学习了通过xml文件和编程混合的方式设置UI。对于界面布局组件,可以通过xml文件实现,而对于按键和图像视图等控件,可以...可以通过两种方法实现在按键上显示图像的功能。一种方法是使用Button控件,另
  • 4 图像显示部位的修改 当触摸中间位置ImageView控件的某个位置时,下部位置的ImageView控件显示该位置的局部放大图。通过为中间位置ImageView控件添加触摸事件监听器来实现上述功能。 4.1 触摸事件监听器 通过...
  • 在编辑窗口的界面中插入图像显示控件 更改ID使用图像编辑界面调整大小(使用线性布局) 其中XML文件内容: &lt;?xml version="1.0" encoding="utf-8"?&gt; &lt;LinearLayo...
  • 常用视图控件 ...图像视图(Imageview) 吐司提示框(Toast) 拖动条(SeekBar) 文本显示框(Textview) 视频播放(VideoView) 网页视图控件(WebView) 对话框(Dialog) 选择器(Picker) 下拉列表框(...
  • 最近遇到一个手机适配问题,就是同样的一个app运行在安卓9.0手机上的显示安卓其他设备上的颜色比较浅。 因为项目是通过TextureView来绘制界面图像的,所以我只能先去了解这个类相关的Api,试图通过更改Windows的...
  • 学习安卓5

    2021-02-26 15:55:29
    android:foreground:*设置改帧布局容器的前景图像android:foregroundGravity:设置前景图像显示的位置 6 AbsoluteLayout(绝对布局) 绝对布局需要通过指定x、y坐标来控制每一个控件的位置, 放入该布局的组件需要通过...
  • Android安卓——UI组件

    2017-12-29 19:05:56
    提供了处理用户输入的控制器(Controller)、显示用户界面和图像的视图(View),以及保存数据和代码的模型(Model) 基本界面控件1、简介 Android系统的界面控件分为定制控件和系统控件 定制控件是用户独立开发的...
  • 前一天我们学习了通过Button控件和ImageButton控件实现图像按键以及按键图像切换的功能。通过指定Button控件的“background”...Button控件除了能够显示图像外,还能够显示文字;ImageButton则只能显示图像。 今天将
  • 说明:以前显示一个水果(图文)采用一个垂直的线性布局,包含一个图像控件和一个标签控件,现在只需要一个标签控件就可以搞定,利用标签的drawableTop属性来实现。 1.放入水果小图片到drawable资源文件里 2.编写...
  • 文章目录一、运行效果二、涉及知识点三、实现步骤1、创建安卓应用【GameSpecialEffect】2、将逐帧动画素材拷贝到drawable目录里3、主布局资源文件acitivity_main.xml4、字符串资源文件strings.xml5、主界面类...
  • 显示任意图像,例如图标。ImageView类可以加载各种来源的图片(如资源或图片库),需要计算图像的尺寸,比便它可以在其他布局中使用,并提供例如缩放和着色(渲染)各种显示选项。 1 XML属性 android:layout_width=...
  • 前一天学习了ListView控件显示图像和文字的方法。通过设置ListView控件的适配器实现。该适配器为自定义适配器,在自定义适配器中,重写getView()方法,设置ListView每个子项的数据、布局以及布局中各控件显示的...
  • ApkIDE——安卓反编译

    2014-10-19 10:52:47
    针对上网本小屏幕(屏幕分辨率高度600的)调整搜索面板中控件尺寸来显示全部。 同时为搜索、替换文本框增加一个扩展编辑器。 搜索结果面板中添加“全部关闭”功能,以便一键关闭所有搜索标签。 版本:2.4.1 alpha...
  • 可是抓取图像之后不能转为bitmap在imageview中显示 Utils.matToBitmap(mTmp,bit); 一直卡在这一句 跪求大大们指点 不知道代码有没有用 贴上来再说 顺便求问一下我的cameraview旋转之后没有全屏 这是为什么 怎么...
  • 我在用Qt做的一个抓屏的程序,用到QML中的 grabToImage() 函数,抓屏获得的数据在另外一个控件显示,这个函数在windows上和安卓模拟器上都可以正常工作,但是在安卓真机上不能正常工作,获取的图像大小正常但是...
  • 3.显示要播放的音乐名 4.要求窗口有背景图片 (二) 知识点 1.按钮(Button) 2.标签(TextView) 3.进度条(ProgressBar) 4.拖拽条(SeekBar) 5.列表控件(ListView) 6.单选按钮(RadioButton) 7.媒体播放器...
  • CircularGallary

    2015-08-19 17:30:43
    安卓自定义控件(循环Gallery),创建Gallery控件,可实现所有显示图像的循环切换
  •  安卓系统中,Button是程序和用户进行交互的一个重要控件,今天我们就来简单的对Button进行学习,其中Button组件是文本按钮(继承自TextView),而ImageButton是图像按钮(继承自ImageView)。两者之间的区别在于: ...
  • LVGL7.0高级界面开发-1

    2021-01-16 11:15:25
    综合界面开发-1 创建一个类似安卓的界面,用到的知识有style,tabview,imgbtn,img,list,label,cont,bar。... cont容器,各种控件都可以放在里面,在屏幕上可以作为一个整体显示,毕竟page、win等也
  • android里面显示图像的时候,使用的是32位的手法去表示的。 argb – 透明 : 8位 , 红色8位 , 绿色:8为 , 蓝色:8位 24位的位图代表的是每个像素点有3个字节的长度, 32位的位图,就应该是4个字节的长度 二、...
  • 控制需要显示输入法和不需要显示输入法,当某些控件不需要弹出输入法,只需要对应不需要弹出输入法的控件设置属性noinput为真即可。例如ui->txt->setProperty("noinput", true); 自适应屏幕大小,输入法弹出...
  • Android 上百实例源码分析以及开源分析 集合打包4

    千次下载 热门讨论 2012-07-10 21:54:03
    ContactsPositionOverlay 接触者的位置显示物,Overlay的子类,主要负责在地图上显示自定义图像,内置滚动与否以及图像大小改变与否,在地图上话画在线联系人以及场景等。 ContactsUpdaterBehaviour主要表现在其设置...

空空如也

空空如也

1 2
收藏数 33
精华内容 13
关键字:

安卓显示图像控件