Android ApiDemos 系列解析【View-ImageView/ImageButton】

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
简介:




今天来讲一下两个经典的图像组件:ImageButton 和 ImageView 。

第一讲:ImageView
ImageView layout 文件 位于ApiDemos 的位置: ApiDemos/res/layout/image_view_1.xml,源码为:
 
<? xml version="1.0" encoding="utf-8" ?>

< ScrollView  xmlns:android ="http://schemas.android.com/apk/res/android"
    android:layout_width
="fill_parent"
    android:layout_height
="fill_parent" >
    
    
< LinearLayout
        
android:layout_width ="fill_parent"
        android:layout_height
="fill_parent"
        android:orientation
="vertical" >
        
        
<!--  The following four examples use a large image  -->
        
<!--  1. Non-scaled view, for reference  -->
        
< TextView
            
android:layout_width ="fill_parent"
            android:layout_height
="wrap_content"
            android:paddingTop
="10dip"
            android:text
="@string/image_view_large_normal" />
        
< ImageView
            
android:src ="@drawable/sample_1"
            android:adjustViewBounds
="true"
            android:layout_width
="wrap_content"
            android:layout_height
="wrap_content"   />
            
        
<!--  2. Limit to at most 50x50  -->
        
< TextView
            
android:layout_width ="fill_parent"
            android:layout_height
="wrap_content"
            android:paddingTop
="10dip"
            android:text
="@string/image_view_large_at_most" />
        
< ImageView
            
android:src ="@drawable/sample_1"
            android:adjustViewBounds
="true"
            android:maxWidth
="50dip"
            android:maxHeight
="50dip"
            android:layout_width
="wrap_content"
            android:layout_height
="wrap_content"   />

       
<!--  3. Limit to at most 70x70, with 10 pixels of padding all around  -->
        
< TextView
            
android:layout_width ="fill_parent"
            android:layout_height
="wrap_content"
            android:paddingTop
="10dip"
            android:text
="@string/image_view_large_at_most_padded" />
       
< ImageView
            
android:src ="@drawable/sample_1"
            android:background
="#66FFFFFF"
            android:adjustViewBounds
="true"
            android:maxWidth
="70dip"
            android:maxHeight
="70dip"
            android:padding
="10dip"
            android:layout_width
="wrap_content"
            android:layout_height
="wrap_content"   />
            
        
<!--  4. Limit to exactly 70x70, with 10 pixels of padding all around  -->
        
< TextView
            
android:layout_width ="fill_parent"
            android:layout_height
="wrap_content"
            android:paddingTop
="10dip"
            android:text
="@string/image_view_large_exactly_padded" />
        
< ImageView
            
android:src ="@drawable/sample_1"
            android:background
="#66FFFFFF"
            android:scaleType
="centerInside"
            android:padding
="10dip"
            android:layout_width
="70dip"
            android:layout_height
="70dip"   />

        
<!--  Repeating the previous four examples with small image  -->
        
<!--  1. Non-scaled view, for reference  -->
        
< TextView
            
android:layout_width ="fill_parent"
            android:layout_height
="wrap_content"
            android:paddingTop
="10dip"
            android:text
="@string/image_view_small_normal" />
        
< ImageView
            
android:src ="@drawable/stat_happy"
            android:background
="#FFFFFFFF"
            android:adjustViewBounds
="true"
            android:layout_width
="wrap_content"
            android:layout_height
="wrap_content"   />
            
        
<!--  2. Limit to at most 50x50  -->
        
< TextView
            
android:layout_width ="fill_parent"
            android:layout_height
="wrap_content"
            android:paddingTop
="10dip"
            android:text
="@string/image_view_small_at_most" />
        
< ImageView
            
android:src ="@drawable/stat_happy"
            android:background
="#FFFFFFFF"
            android:adjustViewBounds
="true"
            android:maxWidth
="50dip"
            android:maxHeight
="50dip"
            android:layout_width
="wrap_content"
            android:layout_height
="wrap_content"   />

       
<!--  3. Limit to at most 70x70, with 10 pixels of padding all around  -->
        
< TextView
            
android:layout_width ="fill_parent"
            android:layout_height
="wrap_content"
            android:paddingTop
="10dip"
            android:text
="@string/image_view_small_at_most_padded" />
        
< ImageView
            
android:src ="@drawable/stat_happy"
            android:background
="#FFFFFFFF"
            android:adjustViewBounds
="true"
            android:maxWidth
="70dip"
            android:maxHeight
="70dip"
            android:padding
="10dip"
            android:layout_width
="wrap_content"
            android:layout_height
="wrap_content"   />
            
        
<!--  4. Limit to exactly 70x70, with 10 pixels of padding all around  -->
        
< TextView
            
android:layout_width ="fill_parent"
            android:layout_height
="wrap_content"
            android:paddingTop
="10dip"
            android:text
="@string/image_view_small_exactly_padded" />
        
< ImageView
            
android:src ="@drawable/stat_happy"
            android:background
="#FFFFFFFF"
            android:scaleType
="centerInside"
            android:padding
="10dip"
            android:layout_width
="70dip"
            android:layout_height
="70dip"   />

 
    
</ LinearLayout >
</ ScrollView >
 
  • ScrollView   子节点只允许一个View 视图,如果有多于一个子节点将会报错;
  • android:paddingTop 与上节点边距的填充;
  • android:adjustViewBounds 如果设置为true 图像将自动调整自己的宽主;
  • android:maxWidth 设置图像的最大高;
  • android:maxHeight 设置图像的最大高;
  • android:scaleType  控制如何调整图像大小或者移动范围,以配合ImageView 的大小。下面是 scaleType 所支持的类型:
    Constant Value Description
    matrix 0
    fitXY 1
    fitStart 2
    fitCenter 3
    fitEnd 4
    center 5
    centerCrop 6
    centerInside 7
  • android:padding 设置上、下、左、右的填充
 
ImageView java 文件 位于ApiDemos 的位置: ApiDemos/src/com.example.android.apis.view/ImageView1,源码为:
 


package  com.example.android.apis.view;

import  android.app.Activity;
import  android.os.Bundle;

import  com.example.android.apis.R;


/**
 * Demonstrates setting size constraints on {
@link  android.widget.ImageView}
 *
 
*/
public   class  ImageView1  extends  Activity {
    
    @Override
    
public   void  onCreate(Bundle savedInstanceState) {
        
super .onCreate(savedInstanceState);
        setContentView(R.layout.image_view_1);
    }
}
 
 
在这里,无须多讲此类。
运行效果图如下:
扩展 LinearLayout
看上图效果和代码,ImgeView 始终跟着一个TextView ,从代码角度上有点不雅观,那如何改变它呢?一步一步跟着我做吧。
  • 1、第一步,新建一个包
    com.terry.Ext 做为组件扩展包
  • 2、第二步,新建一个类
    imageViewExt.java 做为组件扩展类
  • 3、第三步,使此类继承 LinearLayout 布局
    public class imageViewExt extends LinearLayout
  • 4、第四步,在构造函数中通过参数判断传进来的值做逻辑,具体代码后如下:
    package  com.terry.Ext;

    import  android.content.Context;
    import  android.graphics.drawable.Drawable;
    import  android.util.AttributeSet;
    import  android.view.LayoutInflater;
    import  android.widget.ImageView;
    import  android.widget.LinearLayout;
    import  android.widget.TextView;

    public   class  imageViewExt  extends  LinearLayout {

        
    private  TextView tv;
        
    private  String labelText;
        
    private   int  FontSize;
        
    private  String Position;
        
    private  Drawable bitmap;
        
    private  ImageView iv;

        
    public  imageViewExt(Context context, AttributeSet attrs) {
            
    super (context, attrs);
            
    //  TODO Auto-generated constructor stub
             int  resourceid;
            resourceid 
    =  attrs.getAttributeResourceValue( null " labelText " 0 );
            
    if  (resourceid  ==   0 ) {
                labelText 
    =  attrs.getAttributeValue( null " labelText " );
            } 
    else  {
                labelText 
    =  getResources().getString(resourceid);
            }
            
    if  (labelText  ==   null ) {
                labelText 
    =   " 默认 " ;
            }
            resourceid 
    =  attrs.getAttributeResourceValue( null " imgSrc " 0 );
            
    if  (resourceid  >   0 ) {
                bitmap 
    =  getResources().getDrawable(resourceid);
            } 
    else  {
                
    throw   new  RuntimeException( " 图像资源为空 " );
            }
            resourceid 
    =  attrs.getAttributeResourceValue( null " FontSize " 0 );
            
    if  (resourceid  ==   0 ) {
                FontSize 
    =  attrs.getAttributeIntValue( null " FontSize " 12 );
            } 
    else  {
                FontSize 
    =  getResources().getInteger(resourceid);
            }

            resourceid 
    =  attrs.getAttributeResourceValue( null " Position " 0 );
            
    if  (resourceid  ==   0 ) {
                Position 
    =  attrs.getAttributeValue( null " Position " );
            } 
    else  {
                Position 
    =  getResources().getString(resourceid);
            }
            
    if  (Position  ==   null ) {
                Position 
    =   " left " ;
            }

            String infService 
    =  Context.LAYOUT_INFLATER_SERVICE;
            LayoutInflater li 
    =  (LayoutInflater) context
                    .getSystemService(infService);
            
    if  ( " left " .equals(Position)) {
                li.inflate(com.terry.R.layout.image_horizontal, 
    this );
            } 
    else   if  ( " top " .equals(Position)) {
                li.inflate(com.terry.R.layout.image_vertical, 
    this );
            } 
    else  {
                
    throw   new  RuntimeException( " 必须为top 和left 属性 " );
            }
            tv 
    =  (TextView) findViewById(com.terry.R.id.TextView01);
            iv 
    =  (ImageView) findViewById(com.terry.R.id.imageview1);
            iv.setImageDrawable(bitmap);
            tv.setTextSize((
    float ) FontSize);

            tv.setText(labelText);

        }

    }
     
    上面通过传进来的资源做判断,先假设传进来的是资源ID,然后判断最后加载不同的XML来布局文件,两个XML文件代码如下:
     
    <? xml version="1.0" encoding="UTF-8" ?>
    < LinearLayout  android:id ="@+id/LinearLayout01"
        android:layout_width
    ="fill_parent"  android:layout_height ="fill_parent"
        xmlns:android
    ="http://schemas.android.com/apk/res/android" >

        
    < TextView  android:id ="@+id/TextView01"  android:layout_width ="wrap_content"
            android:layout_height
    ="wrap_content" ></ TextView >
        
    < ImageView  android:layout_width ="wrap_content"  android:id ="@+id/imageview1"
            android:layout_height
    ="wrap_content" ></ ImageView >
    </ LinearLayout >
     
     
    <? xml version="1.0" encoding="UTF-8" ?>
    < LinearLayout  android:id ="@+id/LinearLayout01"
        android:orientation
    ="vertical"  android:layout_width ="fill_parent"
        android:layout_height
    ="fill_parent"  xmlns:android ="http://schemas.android.com/apk/res/android" >
        
    < TextView  android:id ="@+id/TextView01"  android:layout_width ="wrap_content"
            android:layout_height
    ="wrap_content" ></ TextView >
        
    < ImageView  android:layout_width ="wrap_content"  android:id ="@+id/imageview1"
            android:layout_height
    ="wrap_content" ></ ImageView >
    </ LinearLayout >
     
  • 5、在XML中使用刚扩展的视图 imageViewExt,代码片段如下:
    < com.terry.Ext.imageViewExt  android:id ="@+id/img"
                android:clickable
    ="true"  android:layout_width ="wrap_content"
                labelText
    ="封装ImageExt"  imgSrc ="@drawable/stat_happy"  Position ="top"
                android:layout_height
    ="wrap_content" >
            
    </ com.terry.Ext.imageViewExt >
     
    Tip: com.terry.Ext.imageViewExt 此句为你的包名加你的扩展视图名称。效果如下:

    在这里你可以通过设置Position 调整图片和文本的位置这就是一个简单扩展组件的DEMO 当然,要扩展还会涉及到动态设置获取还有事件监听等内容,这些我们以后慢慢摸索。
第二讲:ImageButton
ImageButton layout 文件 位于ApiDemos 的位置: ApiDemos/res/layout/image_button_1.xml,源码为:
< LinearLayout  xmlns:android ="http://schemas.android.com/apk/res/android"
    android:layout_width
="fill_parent"
    android:layout_height
="fill_parent"
    android:orientation
="vertical" >

    
< ImageButton
        
android:layout_width ="100dip"
        android:layout_height
="50dip"
        android:src
="@android:drawable/sym_action_call"   />
        
       
< ImageButton
        
android:layout_width ="wrap_content"
        android:layout_height
="wrap_content"
        android:src
="@android:drawable/sym_action_chat"   />     
        
       
< ImageButton
        
android:layout_width ="wrap_content"
        android:layout_height
="wrap_content"
        android:src
="@android:drawable/sym_action_email"   />     
</ LinearLayout >
 
其中: android:src ="@android:drawable/sym_action_chat" 此字样的文字为调用系统内置icon ,系统图标大全可点击如下: 图标大全
 
ImageButton java 文件 位于ApiDemos 的位置: ApiDemos/src/com.example.android.apis.view/ImageButton1,源码为:
 
 

package  com.example.android.apis.view;

import  android.app.Activity;
import  android.os.Bundle; 


import  com.example.android.apis.R;


public   class  ImageButton1  extends  Activity {
    
    @Override
    
public   void  onCreate(Bundle savedInstanceState) {
        
super .onCreate(savedInstanceState);
        setContentView(R.layout.image_button_1); 
    }
}
 
由于只是加载内容,这里不做介绍,运行效果如下:
 
使用XML为ImageButton做交互事件
有看过上篇文章的朋友肯定知道如何为按钮做按下弹起图片交互的事件操作,由于ImageButton 是一个变型的Button 故它在事件上也是跟有Button 的点击或者Touch事件,但是ImageView 并不是TextView 的子类,故它并不支持settext的方法或者指定文本,如果需要使其有支持文本功能,建议有二:A,不使用ImageButton 支持使用Button ,Button 可使用BackGround做图片并加文字 ;B,扩展组件,在onDraw 事件里面为ImageButton 画文字 ,具体可参照上边代码。
那么如何才能使用XML为ImageButton 做图片切换的交互呢?看XML代码:
<? xml version="1.0" encoding="utf-8" ?>
< selector  xmlns:android ="http://schemas.android.com/apk/res/android" >

    
< item  android:state_pressed ="true"  android:drawable ="@drawable/button_pressed"   />   
    
< item  state_focused ="true"  android:drawable ="@drawable/button_focused"   />   
    
<!--   <item android:drawable="@drawable/icon" />  default  -->

</ selector >
然后设置ImageButton 的SRC 图片路径:
< ImageButton  android:id ="@+id/ImageButton01"  android:src ="@drawable/my_image"
        android:layout_width
="wrap_content"  android:layout_height ="wrap_content" >
    
</ ImageButton >
Tip:XML文件必须于res/drawable 中的任意文件夹,代表该XML为图像XML文件索引。
假如真需要使用JAVA编码来实现也可以,具体你可以参照上篇博文: Android ApiDemo 系列解析【View->Button】
运行效果如下:



 本文转自 terry_龙 51CTO博客,原文链接:http://blog.51cto.com/terryblog/364963,如需转载请自行联系原作者


相关文章
|
1月前
|
Java 开发工具 Android开发
Android与iOS开发环境搭建全解析####
本文深入探讨了Android与iOS两大移动操作系统的开发环境搭建流程,旨在为初学者及有一定基础的开发者提供详尽指南。我们将从开发工具的选择、环境配置到第一个简单应用的创建,一步步引导读者步入移动应用开发的殿堂。无论你是Android Studio的新手还是Xcode的探索者,本文都将为你扫清开发道路上的障碍,助你快速上手并享受跨平台移动开发的乐趣。 ####
|
24天前
|
存储 Linux API
深入探索Android系统架构:从内核到应用层的全面解析
本文旨在为读者提供一份详尽的Android系统架构分析,从底层的Linux内核到顶层的应用程序框架。我们将探讨Android系统的模块化设计、各层之间的交互机制以及它们如何共同协作以支持丰富多样的应用生态。通过本篇文章,开发者和爱好者可以更深入理解Android平台的工作原理,从而优化开发流程和提升应用性能。
|
24天前
|
Java 调度 Android开发
安卓与iOS开发中的线程管理差异解析
在移动应用开发的广阔天地中,安卓和iOS两大平台各自拥有独特的魅力。如同东西方文化的差异,它们在处理多线程任务时也展现出不同的哲学。本文将带你穿梭于这两个平台之间,比较它们在线程管理上的核心理念、实现方式及性能考量,助你成为跨平台的编程高手。
|
1月前
|
开发框架 Dart Android开发
安卓与iOS的跨平台开发:Flutter框架深度解析
在移动应用开发的海洋中,Flutter作为一艘灵活的帆船,正引领着开发者们驶向跨平台开发的新纪元。本文将揭开Flutter神秘的面纱,从其架构到核心特性,再到实际应用案例,我们将一同探索这个由谷歌打造的开源UI工具包如何让安卓与iOS应用开发变得更加高效而统一。你将看到,借助Flutter,打造精美、高性能的应用不再是难题,而是变成了一场创造性的旅程。
|
1月前
|
安全 Java Linux
深入解析Android系统架构及其对开发者的意义####
【10月更文挑战第21天】 本文旨在为读者揭开Android操作系统架构的神秘面纱,探讨其如何塑造现代移动应用开发格局。通过剖析Linux内核、硬件抽象层、运行时环境及应用程序框架等关键组件,揭示Android平台的强大功能与灵活性。文章强调了理解Android架构对于开发者优化应用性能、提升用户体验的重要性,并展望了未来技术趋势下Android的发展方向。 ####
47 0
|
2月前
|
开发工具 Android开发 iOS开发
深入解析安卓与iOS开发环境的优劣
【10月更文挑战第4天】 本文将深入探讨安卓和iOS两大主流移动操作系统的开发环境,从技术架构、开发工具、用户体验等方面进行详细比较。通过分析各自的优势和不足,帮助开发者更好地理解这两个平台的异同,从而为项目选择最合适的开发平台提供参考。
33 3
|
1月前
|
安全 5G Android开发
安卓与iOS的较量:技术深度解析
【10月更文挑战第24天】 在移动操作系统领域,安卓和iOS无疑是两大巨头。本文将深入探讨这两个系统的技术特点、优势和不足,以及它们在未来可能的发展方向。我们将通过对比分析,帮助读者更好地理解这两个系统的本质和内涵,从而引发对移动操作系统未来发展的深思。
54 0
|
2月前
|
安全 Android开发 iOS开发
深入解析:安卓与iOS的系统架构及其对应用开发的影响
本文旨在探讨安卓与iOS两大主流操作系统的架构差异,并分析这些差异如何影响应用开发的策略和实践。通过对比两者的设计哲学、安全机制、开发环境及性能优化等方面,本文揭示了各自的特点和优势,为开发者在选择平台和制定开发计划时提供参考依据。
67 4
|
2月前
|
测试技术 数据库 Android开发
深入解析Android架构组件——Jetpack的使用与实践
本文旨在探讨谷歌推出的Android架构组件——Jetpack,在现代Android开发中的应用。Jetpack作为一系列库和工具的集合,旨在帮助开发者更轻松地编写出健壮、可维护且性能优异的应用。通过详细解析各个组件如Lifecycle、ViewModel、LiveData等,我们将了解其原理和使用场景,并结合实例展示如何在实际项目中应用这些组件,提升开发效率和应用质量。
53 6
|
2月前
|
安全 网络安全 Android开发
深度解析:利用Universal Links与Android App Links实现无缝网页至应用跳转的安全考量
【10月更文挑战第2天】在移动互联网时代,用户经常需要从网页无缝跳转到移动应用中。这种跳转不仅需要提供流畅的用户体验,还要确保安全性。本文将深入探讨如何利用Universal Links(仅限于iOS)和Android App Links技术实现这一目标,并分析其安全性。
389 0

推荐镜像

更多