zoukankan      html  css  js  c++  java
  • ImageSwitcher的应用

    在android的开发中很多时候都会用到图片的切换,我相信大家在安装完apk后,都会遇到弹出用户向导,介绍本版本apk的新功能,如果你用的是平板电脑或手机的话,可以左右滑动以切换视图,如果你用的是android机顶盒的话,可以按遥控器的左右键以切换视图。那么这种用户向导切换图片是怎么做的呢? 当然答案有很多种,应该android中有太多方式可以实现了,比如ViewFilper ,ViewPager。这里我就介绍一种最简单的方式,那就是采用ImageSwitcher 图片切换器!

    首先看一下ImageSwitcher的类继承结构:

    java.lang.Object 
       ↳ android.view.View 
         ↳ android.view.ViewGroup 
           ↳ android.widget.FrameLayout 
             ↳ android.widget.ViewAnimator 
               ↳ android.widget.ViewSwitcher 
                 ↳ android.widget.ImageSwitcher 
    

    比较复杂! 和这个类等同继续结构的还有一个叫做TextSwitcher。他们两个是ViewSwitcher的唯一的两个子类,在ViewSwitcher中定义了一个接口叫做ViewFactory,所以在使用ImageSwitcher和TextSwitcher时必须要实现这个接口,其实在这个接口中,就只有一个方法,如下:

    public abstract View makeView () 
        Function:Creates a new View to be added in a ViewSwitcher.
        Returns: a View


    好了,到这里介绍ImageSwitcher就差不多了,咋门先来看看最后的实现结果


    最下面的4个小点可以理解为位置指示吧,当前在那一页,最明显的小点,就会留在那个位置。这是通过LinearLayout加入TextView来实现的,其实这些小点都是TextView,只是背景颜色不一样而已,这里后面会具体介绍。


    我们先来看看布局文件:act_guide.xml

    <?xml version="1.0" encoding="utf-8"?>
    <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:orientation="vertical" >
    
        <ImageSwitcher
            android:id="@+id/guide_content"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:background="@android:color/white" />
    
        <LinearLayout
            android:id="@+id/guide_indicator"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="bottom|center_horizontal"
            
            android:gravity="center_horizontal"
            android:orientation="horizontal" />
    </FrameLayout>


    由于美观,要实现图片滑动效果,所有这里添加了2个动画,在res下新建anim文件夹,添加如下文件

    slide_in_right.xml

    <?xml version="1.0" encoding="utf-8"?>
    <set xmlns:android="http://schemas.android.com/apk/res/android" >
    
        <translate
            android:duration="500"
            android:fromXDelta="50%p"
            android:toXDelta="0" />
    
        <alpha
            android:duration="700"
            android:fromAlpha="0.0"
            android:toAlpha="1.0" />
    </set>


    slide_out_left.xml

    <?xml version="1.0" encoding="utf-8"?>
    <set xmlns:android="http://schemas.android.com/apk/res/android" >
        <translate
            android:duration="500"
            android:fromXDelta="0"
            android:toXDelta="-50%p" />
    
        <alpha
            android:duration="700"
            android:fromAlpha="1.0"
            android:toAlpha="0.0" />
    </set>


    好,之前提过的个4个小圆点,是怎么画上去的呢?这里就需要在res下新建一个drawable文件夹,在里面添加两个绘图的配置文件:

    indicator_n.xml 即没有选中的颜色

    <?xml version="1.0" encoding="utf-8"?>
    <shape xmlns:android="http://schemas.android.com/apk/res/android"
        android:innerRadius="0dp"
        android:shape="ring"
        android:thickness="10dp"
        android:useLevel="false" >
        <size
            android:height="40dp"
            android:width="40dp" />
        <solid android:color="#88666666" />
    </shape>


    indicator_s.xml 即选中了的颜色

    <?xml version="1.0" encoding="utf-8"?>
    <shape xmlns:android="http://schemas.android.com/apk/res/android"
        android:innerRadius="0dp"
        android:shape="ring"
        android:thickness="10dp"
        android:useLevel="false" >
        <size
            android:height="40dp"
            android:width="40dp" />
        <solid android:color="#ff0b7fe4" />
    </shape>

    好,接下来,我们来看看主activity是怎样调用的:

    Act_guide.java

    package dxd.android.imageswitcher;
    
    import android.app.Activity;
    import android.os.Bundle;
    import android.view.KeyEvent;
    import android.view.LayoutInflater;
    import android.view.MotionEvent;
    import android.view.View;
    import android.view.View.OnTouchListener;
    import android.view.ViewGroup;
    import android.widget.FrameLayout;
    import android.widget.FrameLayout.LayoutParams;
    import android.widget.ImageSwitcher;
    import android.widget.ImageView;
    import android.widget.ImageView.ScaleType;
    import android.widget.LinearLayout;
    import android.widget.TextView;
    import android.widget.ViewSwitcher.ViewFactory;
    
    public class ActGuide extends Activity implements ViewFactory {
    
    	protected LayoutInflater mInflater;
    	protected ImageSwitcher switcher;
    	protected int[] itemIDs;
    	protected int pos;
    	protected int last;
    	protected LinearLayout indicator;
    	protected ViewGroup mParent;
    	protected boolean intercept = false;
    
    	@Override
    	public void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		mInflater = LayoutInflater.from(this);
    		setContentView(R.layout.act_help);
    		
    		addViews() ;
    	}
    
    	protected void addViews() {
    		itemIDs = new int[] { R.drawable.s1, R.drawable.s2, R.drawable.s3,R.drawable.s4};
    		switcher = (ImageSwitcher)findViewById(R.id.guide_content);
    		switcher.setFactory(this);
    		switcher.setImageResource(itemIDs[pos]);
    		
    		indicator = (LinearLayout) findViewById(R.id.guide_indicator);
    		for (int i = 0; i < itemIDs.length; i++) {
    			TextView item = new TextView(this);
    			item.setLayoutParams(new LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT));
    			if (i == 0) {
    				item.setBackgroundResource(R.drawable.indicator_s);
    			} else {
    				item.setBackgroundResource(R.drawable.indicator_n);
    			}
    			indicator.addView(item);
    		}
    	    // 响应 触摸事件
    	    switcher.setOnTouchListener(new OnTouchListener() {
    			private float x;
    			private boolean lock;
    
    			@Override
    			public boolean onTouch(View v, MotionEvent event) {
    				switch (event.getAction()) {
    				case MotionEvent.ACTION_DOWN:
    					x = event.getX();
    					lock = true;
    					break;
    				case MotionEvent.ACTION_MOVE:
    					if (lock) {
    						float dltaX = x - event.getX();
    						if (dltaX > 100) {
    							showNext();
    							lock = false;
    						} else if (dltaX < -100) {
    							showPre();
    							lock = false;
    						}
    				     }
    					 break;
    				}
    				return true;
    				}
    		});
    	}
    
    	@Override
    	public View makeView() {
    		ImageView imageView = new ImageView(this);
    		imageView.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
    		imageView.setScaleType(ScaleType.FIT_XY);
    		return imageView;
    	}
            // 响应左右按键
    	@Override
    	public boolean onKeyDown(int keyCode, KeyEvent event) {
    		switch (keyCode) {
    		case KeyEvent.KEYCODE_DPAD_LEFT:
    			showPre();
    			return true;
    		case KeyEvent.KEYCODE_DPAD_RIGHT:
    			showNext();
    			return true;
    		}
    		return super.onKeyDown(keyCode, event);
    	}
    
    	protected void showNext() {
    		last = pos++;
    		if (pos == itemIDs.length) {
    			pos = itemIDs.length - 1;
    			return;
    		}
    		switcher.setInAnimation(this, R.anim.slide_in_right);
    		switcher.setOutAnimation(this, R.anim.slide_out_left);
    		switcher.setImageResource(itemIDs[pos]);
    		indicator.getChildAt(last).setBackgroundResource(R.drawable.indicator_n);
    		indicator.getChildAt(pos).setBackgroundResource(R.drawable.indicator_s);
    	}
    
    	protected void showPre() {
    		last = pos--;
    		if (pos < 0) {
    			pos = 0;
    			return;
    		}
    		switcher.setInAnimation(this, android.R.anim.slide_in_left);
    		switcher.setOutAnimation(this, android.R.anim.slide_out_right);
    		switcher.setImageResource(itemIDs[pos]);
    		indicator.getChildAt(last).setBackgroundResource(R.drawable.indicator_n);
    		indicator.getChildAt(pos).setBackgroundResource(R.drawable.indicator_s);
    	}
    }
    


    主要的代码就是这样的了。当然,之前说了,这不是唯一能实现的方式,还有很多方式都可以实现这样的效果。但是,如果这个用户向导或其他什么向导,只要是以图片切换为主,那么就选用这个ImageSwitcher吧! 方便快捷地就能够搭建好应用程序的外观。当然如果是需要View中有控件的切换的话,用ViewPager也是很好的选择。这里就不多介绍了,以后专门写出专题。















  • 相关阅读:
    Linux 之 编译器 gcc/g++参数详解
    linux下history命令显示历史指令记录的使用方法
    Linux 命令之 Navicat 连接 Linux 下的Mysql数据库
    Linux命令
    CentOS 下安装
    CMD命令之 :修改windows的CMD窗口输出编码格式为UTF-8
    CTO、技术总监、首席架构师的区别
    PHP ServerPush (推送) 技术的探讨
    一个公司的管理层级结构
    Table of Contents
  • 原文地址:https://www.cnblogs.com/keanuyaoo/p/3263092.html
Copyright © 2011-2022 走看看