zoukankan      html  css  js  c++  java
  • Android:ViewSwitcher

    ViewSwitcher

    1. ViewSwitcher is a subclass of ViewAnimator which is a subclass of Fragment.

    2. A ViewSwitcher is a ViewAnimator that switches between two views, and has a factory(ViewFactory) from which these views are created.

      You can either use the factory to create the views, or add them yourself. A ViewSwitcher can only have two child views, of which only one is shown at a time.

    3.The following demo is a sample to learn about ViewSwitcher:

    activity_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"
        tools:context=".MainActivity" >
        
        <com.slowalker.viewswitcher.SlideMenuSwitcher
            android:id="@+id/slide_view"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            />
        
        <Button 
            android:id="@+id/pre_screen"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentBottom="true"
            android:layout_alignParentLeft="true"
            android:text="Previous Screen"
            />
        
        <Button 
            android:id="@+id/next_screen"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentBottom="true"
            android:layout_alignParentRight="true"
            android:text="Next Screen"
            />
    
    </RelativeLayout>
    View Code

    MainActivity.java

    package com.slowalker.viewswitcher;
    
    import java.util.ArrayList;
    
    import com.slowalker.viewswitcher.MenuData.DataItem;
    import com.slowalker.viewswitcher.R.id;
    
    import android.os.Bundle;
    import android.app.Activity;
    import android.graphics.drawable.Drawable;
    import android.util.Log;
    import android.view.Menu;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.Button;
    
    /*MainActivity*/
    
    public class MainActivity extends Activity implements OnClickListener {
    
        private static final String TAG = MainActivity.class.getSimpleName();
        private static final boolean DEBUG = true;
        
        private SlideMenuSwitcher switcher;
        private Button preBtn;
        private Button nextBtn;
        
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            if (DEBUG) {
                Log.d(TAG, "onCreate");
            }
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            switcher = (SlideMenuSwitcher) findViewById(R.id.slide_view);
            switcher.setData(makeItems());
            preBtn = (Button) findViewById(R.id.pre_screen);
            nextBtn = (Button) findViewById(R.id.next_screen);
            preBtn.setOnClickListener(this);
            nextBtn.setOnClickListener(this);
        }
        
        private ArrayList<DataItem> makeItems() {
            ArrayList<DataItem> items = new ArrayList<DataItem>();
            for (int i = 0; i < 32; i++) {
                items.add(new DataItem("App " + i, getResources().getDrawable(R.drawable.ic_launcher)));
            }
            return items;
        }
    
        @Override
        public void onClick(View v) {
            switch(v.getId()) {
            case R.id.pre_screen:
                switcher.showPreScreen();
                break;
            case R.id.next_screen:
                switcher.showNextScreen();
                break;
            default:
                break;
            }
        }
        
        
    }
    View Code

    SlideMenuSwitcher.java

    package com.slowalker.viewswitcher;
    
    import java.util.ArrayList;
    
    import com.slowalker.viewswitcher.MenuData.DataItem;
    
    import android.content.Context;
    import android.util.AttributeSet;
    import android.util.Log;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.animation.AnimationUtils;
    import android.widget.GridView;
    import android.widget.ViewSwitcher;
    
    /*A ViewSwitcher implements by yourself.*/
    public class SlideMenuSwitcher extends ViewSwitcher {
    
        private static final String TAG = SlideMenuSwitcher.class.getSimpleName();
        private static final boolean DEBUG = true;
        
        private MenuData mMenuData;
        private int mCurrentScreenId;
        private Context mContext;
        
        public SlideMenuSwitcher(Context context) {
            super(context);
            if (DEBUG) {
                Log.d(TAG, "SlideMenuSwitcher(Context context) is invoked.");
            }
            init(context);
        }
        
        public SlideMenuSwitcher(Context context,AttributeSet attri) {
            super(context, attri);
            if (DEBUG) {
                Log.d(TAG, "SlideMenuSwitcher(Context context,AttributeSet attri) is invoked.");
            }
            init(context);
        }
        
        private void init(Context context){
            if (DEBUG) {
                Log.d(TAG, "init");
            }
            mContext = context;
            setFactory(new ViewFactory() {
                
                @Override
                public View makeView() {
                    GridView gv = new GridView(mContext);
                    //gv.setColumnWidth(3);
                    gv.setNumColumns(3);
                    return gv;
                }
            });
    
        }
            
        public void setData(ArrayList<DataItem> items) {
            mMenuData = new MenuData();
            mMenuData.setMenuItems(items);
            mCurrentScreenId = mMenuData.getScreenNumber() >> 1;
            GridView gv = (GridView) getCurrentView();
            OneScreenAdapter adapter = new OneScreenAdapter(mContext, mMenuData.getScreen(mCurrentScreenId));
            gv.setAdapter(adapter);
        }
        
        public void showNextScreen() {
            if (mCurrentScreenId >= mMenuData.getScreenNumber() - 1) return;
            mCurrentScreenId++;
            setInAnimation(AnimationUtils.loadAnimation(mContext, android.R.anim.slide_in_left));
            setOutAnimation(AnimationUtils.loadAnimation(mContext, android.R.anim.slide_out_right));
            setViewData(mCurrentScreenId);
            showNext();
        }
        
        public void showPreScreen() {
            if (mCurrentScreenId <= 0) return;
            mCurrentScreenId--;
            setInAnimation(AnimationUtils.loadAnimation(mContext, android.R.anim.slide_in_left));
            setOutAnimation(AnimationUtils.loadAnimation(mContext, android.R.anim.slide_out_right));
            setViewData(mCurrentScreenId);
            /*I think here is wrong, showNext() will be ok. In fact, either method to invoke will work.*/
            showPrevious();
            //showNext();
        }
    
        private void setViewData(int index) {
            GridView gv = (GridView) getNextView();
            OneScreenAdapter adapter = new OneScreenAdapter(mContext, mMenuData.getScreen(index));
            gv.setAdapter(adapter);
        }
        
    }
    View Code

    MenuData.java

    package com.slowalker.viewswitcher;
    
    import java.util.ArrayList;
    
    import android.graphics.drawable.Drawable;
    /*Data Class*/
    public class MenuData {
        
        public static final int APP_CNT_ONE_SCREEN = 9;
        
        private ArrayList<MenuDataOneScreen> mScreens = new ArrayList<MenuDataOneScreen>();
        
        public void setMenuItems(ArrayList<DataItem> items) {
            int size = items.size();
            int screenCnt = size / APP_CNT_ONE_SCREEN;
            if (size % APP_CNT_ONE_SCREEN != 0) screenCnt++;
            for (int i = 0; i < screenCnt; i++) {
                MenuDataOneScreen screen = new MenuDataOneScreen();
                int l = i * APP_CNT_ONE_SCREEN, r = Math.min(l + APP_CNT_ONE_SCREEN, size) - 1;
                for (int j = l; j <= r; j++) screen.mDataItems.add(items.get(j));
                mScreens.add(screen);
            }
        }
        
        public int getScreenNumber() {
            return mScreens.size();
        }
        
        public MenuDataOneScreen getScreen(int index) {
            return mScreens.get(index);
        }
        
        
        public static class DataItem {
            private String name;
            private Drawable drawable;
            
            public DataItem(String name, Drawable drawable) {
                this.name = name;
                this.drawable = drawable;
            }
            
            public String getName() {
                return this.name;
            }
            
            public Drawable getDrawable() {
                return this.drawable;
            }
        }
        
        public static class MenuDataOneScreen {
            ArrayList<DataItem> mDataItems = new ArrayList<DataItem>();
        }
    }
    View Code

    appdesc.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:orientation="vertical" >
        
        <ImageView
            android:id="@+id/app_logo"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            />
        <TextView 
            android:id="@+id/app_name"
               android:layout_width="wrap_content"
               android:layout_height="wrap_content"
               android:layout_marginTop="10dp" 
            />
    
    </LinearLayout>
    View Code

    OneScreenAdapter.java

    package com.slowalker.viewswitcher;
    
    import com.slowalker.viewswitcher.MenuData.MenuDataOneScreen;
    
    import android.content.Context;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.BaseAdapter;
    import android.widget.ImageView;
    import android.widget.TextView;
    
    /*Adapter for you gridview in a single screen.*/
    public class OneScreenAdapter extends BaseAdapter {
    
        private LayoutInflater inflater;
        private MenuDataOneScreen screen;
        
        public OneScreenAdapter(Context context, MenuDataOneScreen oneScreen) {
            inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            screen = oneScreen; 
        }
        
        @Override
        public int getCount() {
            return screen.mDataItems.size();
        }
    
        @Override
        public Object getItem(int position) {
            return screen.mDataItems.get(position);
        }
    
        @Override
        public long getItemId(int position) {
            return position;
        }
    
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            View view = convertView;
            if (view == null) {
                view = inflater.inflate(R.layout.appdesc, null);
            }
            ImageView iv = (ImageView) view.findViewById(R.id.app_logo);
            TextView tv = (TextView) view.findViewById(R.id.app_name);
            iv.setImageDrawable(screen.mDataItems.get(position).getDrawable());
            tv.setText(screen.mDataItems.get(position).getName());
            return view;
        }
    
    }
    View Code
  • 相关阅读:
    计算后的样式
    getElementsByTagName
    notepad++ 行首行尾添加字符
    Http协议基础知识
    HTTP工作流程
    URI URL URN的区别
    [转] Android利用Fiddler进行网络数据抓包
    微信公众号 跳转到小程序
    现金红包 接口开发注意事项
    现金红包 样式问题
  • 原文地址:https://www.cnblogs.com/slowalker/p/3402552.html
Copyright © 2011-2022 走看看