Android学习心得第四课

算算和上一次的博客又隔了一个星期了,最近这一周效率不是太高,本来一两天就可以完成的任务硬生生的花了快一个星期才搞完,然而发现前面学的东西又开始遗忘了,下面还是先来把我这几天学的东西给记录一下。
第一部分 PagerAdapter和fragmentAdapter
首先是关于PagerAdapter,PagerAdapter是ViewPager的适配器,通过该方法,可以实现控件的滑动效果。这里突然发现好像从来没有仔细的解释过适配器的概念,下面做一个简短的说明。
适配器:把复杂的数据(数组,链表,数据库,集合)填充在指定的视图上。数据适配器是连接数据源和视图界面的桥梁。他一般的实现过程是:新建适配器—添加数据源到适配器—视图加载适配器。
下面对PagerAdapter的讲解在代码中进行诠释:

public class myPagerAdapter extends PagerAdapter{

    private List<View>viewList;
    private List<String>titleList;


    public myPagerAdapter(List<View>viewList,List<String>titleList){
        this.viewList=viewList;
        this.titleList=titleList;
    }

    public static void main(String[] args) {
        // TODO Auto-generated method stub

    }

    // 返回的是页卡的数量
    @Override
    public int getCount() {
        // TODO Auto-generated method stub
        return viewList.size();
    }

    // View是否来自于对象 
    public boolean isViewFromObject(View arg0, Object arg1) {
        // TODO Auto-generated method stub
        return arg0 == arg1;
    }

    // 实例化一个页卡
    @Override
    public Object instantiateItem(ViewGroup container, int position) {
        // TODO Auto-generated method stub
        container.addView(viewList.get(position));
        return viewList.get(position);
    }


    // 销毁一个页 
    @Override
    public void destroyItem(ViewGroup container, int position, Object object) {
        // TODO Auto-generated method stub
        container.removeView(viewList.get(position));
    }
    @Override
    public CharSequence getPageTitle(int position) {
        // TODO Auto-generated method stub
        return titleList.get(position);
    }
}

当然为了实现滑动效果,还可以使用fragmentAdapter的适配器:

package com.example.android_pageradapter;

import java.util.List;

import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;

public class MyFragmentPagerAdapter extends FragmentPagerAdapter{

    private List<String>titleList;
    private List<Fragment>fragList;

    public MyFragmentPagerAdapter(FragmentManager fm,List<String>titleList,List<Fragment>fragList) {
        super(fm);
        this.titleList = titleList;
        this.fragList = fragList;
    }

    @Override
    public Fragment getItem(int arg0) {
        // TODO Auto-generated method stub
        return fragList.get(arg0);
    }

    @Override
    public int getCount() {
        // TODO Auto-generated method stub
        return fragList.size();
    }

    @Override
    public CharSequence getPageTitle(int position) {
        // TODO Auto-generated method stub
        return titleList.get(position);
    }

}

第二部分 scrollview
scrollview是一个比较简单的控件,它主要是为了添加滚动条,ScrollView和HorizontalScrollView分别为垂直方向的滚动条和水平方向的滚动条。ScrollView也叫滚动视图,他一般是用于当拥有很多的内容的时候,屏幕显示不完时,需要通过滚动来显示完整的视图。

public class MainActivity extends Activity {

    private TextView tv;
    private ScrollView scroll;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        tv = (TextView) findViewById(R.id.content);
        tv.setText(getResources().getString(R.string.content));
        scroll = (ScrollView) findViewById(R.id.scroll);
        scroll.setOnTouchListener(new OnTouchListener() {

            public boolean onTouch(View v, MotionEvent event) {
                // TODO Auto-generated method stub
                switch (event.getAction()) {
                case MotionEvent.ACTION_DOWN: {
                    break;
                }
                case MotionEvent.ACTION_UP: {
                    break;
                }
                case MotionEvent.ACTION_MOVE: {
                    /* * (1)getScrollY()---滚动条滑动的距离(2)getMeasuredHeight() * (3)getHeight() */

                    // 顶部
                    if (scroll.getScrollY() <= 0) {
                        Log.i("Main", "滑动到顶部");
                    }

                    // 底部
                    // TextView的总高度 = 一屏幕的高度+滚动条滚动的距离
                    if (scroll.getChildAt(0).getMeasuredHeight() <= scroll
                            .getHeight() + scroll.getScrollY()) {
                        Log.i("Main", "滑动到底部");
                        Log.i("Main",
                                "scroll.getChildAt(0).getMeasuredHeight()"
                                        + scroll.getChildAt(0)
                                                .getMeasuredHeight()
                                        + "scroll.getHeight()"
                                        + scroll.getHeight()
                                        + "scroll.getScrollY()"
                                        + scroll.getScrollY());
                        tv.append(getResources().getString(R.string.content));

                    }

                    break;
                }

                }

                return false;
            }
        });
    }




}

这里关于getMeasureHeight和getHeight这两种方法,用下图来表示最合适。

第三部分 ViewFlipper
ViewFlipper这个控件同样是为了实现滑动效果的控件。

public class MainActivity extends Activity {

    private ViewFlipper flipper;
    private float startX;
    private int[] resId = { R.drawable.pic1, R.drawable.pic2, R.drawable.pic3,
            R.drawable.pic4 };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        // 初始化ViewFlipper
        flipper = (ViewFlipper) findViewById(R.id.flipper);
        // 动态导入的方式为ViewFlipper导入子view
        for (int i = 0; i < resId.length; i++) {
            flipper.addView(getImageView(resId[i]));
        }
        // 为ViewFlipper设置动画效果
        /* flipper.setInAnimation(this, R.anim.left_in); flipper.setOutAnimation(this, R.anim.left_out); // 为ViewFlipper的视图切换设置时间间隔 flipper.setFlipInterval(3000); // 启动ViewFlipper flipper.startFlipping(); */
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        // TODO Auto-generated method stub
        switch (event.getAction()) {
        // 手指落下
        case MotionEvent.ACTION_DOWN: {
            startX = event.getX();
            break;
        }
        // 手指滑动
        case MotionEvent.ACTION_MOVE: {
            //向右滑动(翻看前一页)
            if (event.getX() - startX > 100) {
                flipper.setInAnimation(this, R.anim.left_in);
                flipper.setOutAnimation(this, R.anim.left_out);
                //显示前一页
                flipper.showPrevious();
            }
           if(startX - event.getX()>100){
               flipper.setInAnimation(this, R.anim.right_in);
               flipper.setOutAnimation(this, R.anim.right_out);
                //显示下一页
               flipper.showNext(); 
            }
            break;
        }

        // 手指离开
        case MotionEvent.ACTION_UP: {
            break;
        }

        }

        return super.onTouchEvent(event);
    }

    private ImageView getImageView(int resId) {
        ImageView image = new ImageView(this);
        image.setBackgroundResource(resId);
        return image;
    }
}

上面的代码主要是两种不同的情况一种是自动播放的,核心代码如下:

// 为ViewFlipper设置动画效果
        /*
        flipper.setInAnimation(this, R.anim.left_in);
        flipper.setOutAnimation(this, R.anim.left_out);
        // 为ViewFlipper的视图切换设置时间间隔
        flipper.setFlipInterval(3000);
        // 启动ViewFlipper
        flipper.startFlipping();
        */

一种是通过手势滑动来进行变换的,核心代码如下:

public boolean onTouchEvent(MotionEvent event) {
        // TODO Auto-generated method stub
        switch (event.getAction()) {
        // 手指落下
        case MotionEvent.ACTION_DOWN: {
            startX = event.getX();
            break;
        }
        // 手指滑动
        case MotionEvent.ACTION_MOVE: {
            //向右滑动(翻看前一页)
            if (event.getX() - startX > 100) {
                flipper.setInAnimation(this, R.anim.left_in);
                flipper.setOutAnimation(this, R.anim.left_out);
                //显示前一页
                flipper.showPrevious();
            }
           if(startX - event.getX()>100){
               flipper.setInAnimation(this, R.anim.right_in);
               flipper.setOutAnimation(this, R.anim.right_out);
                //显示下一页
               flipper.showNext(); 
            }
            break;
        }

        // 手指离开
        case MotionEvent.ACTION_UP: {
            break;
        }

        }

        return super.onTouchEvent(event);
    }

你可能感兴趣的:(android)