• 源自梦想 自定义ViewGroup的整理_2


    Android项目:

    1.准备资源图片。图片放到hdip里和mdip里对想过的影响:对于320*480的模拟器,默认去mdip里去找图片资源,拿过来的图片可以直接用,清晰度不变。要是所要找的图片在hdip里,这里的图片默认是高分辨率效果的,而屏幕是中等分辨率的屏幕,那么拿到hdip里的图片后,会对图片进行压缩(大约60%)。显示出来的图片就会变得模糊了。

    2.使用自定义的ViewGroupMyScrollView)实现ViewPager的效果,创建继承ViewGroup的类,实现onLayout方法,这个方法的作用:当继承一个ViewGroup的时候,系统会要求告知ViewGroup中子View的排列方式(指定子View的位置);实现VIewGroup的三个构造方法;

    3.自定义的ViewGroup先写到这,再看看主Activity怎么写。首先定义图片资源的引用(id),然后使用for循环将这些图片放到自定义的ViewGroup里面。

    for (int i = 0; i < ids.length; i++) {

    ImageView image = new ImageView(this);

    //image.setBackgroundResource(ids[i]);

    image.setImageResource(ids[i]);

    msv.addView(image);

    }

    图片有了之后,再创建自定义的MyScrollView对象msv。并将image对象放到msv中。

    这时候就可以setContentView(msv)

    4.在MyScrollView的构造方法中,调用初始化方法init()。实现onLayout方法,使子View从左到右依次排列,并且每一个View都占整个屏幕的大小。效果如下图:

    这就需要在onLayout方法中给每一个子View指定一个位置。

    @Override

    protected void onLayout(boolean changed, int l, int t, int r, int b) {

    for (int i = 0; i < getChildCount(); i++) {

    View view = getChildAt(i);

    view.layout(i*getWidth(), 0, (1+i)*getWidth(), getHeight());

    }

    }

    要想看到右面未显示的View的内容,就要把它滑到屏幕中,这就需要实现Touch事件。要使用GestureDetector实现手势解析,我们创建一个GestureDetector对象detector,并实现它的onGestureListener()监听方法,这时会让我们重写很多方法,这些方法都是在某个特定事件发生的时候执行。

    然后我们重写onTouchEvent方法,这时候就可以使用detector解析touch事件而不是switchevent.getAction())方式了。

    detector.onTouchEvent(event);

    然后实现onGestureListener里的onScroll方法,在这里使用scrollBy方法,穿进去偏移量。

    做了以上事情,就可以初步完成滑动的效果了。

    现在希望,在滑动后手指抬起时当前图片可以自动回到占满屏幕的位置。

    这就需要我们在onTouchEvent方法中对MotionEvent.ACTION_UP进行处理。判断哪张图片应该放到屏幕上去。这个处理可以创建一个方法来实现,moveToDest()

    /**

     * 移动到适当的位置上

     */

    private void moveToDest() {

    int destId = (getScrollX()+getWidth()/2)/getWidth();

    if(destId>getChildCount()-1){

    destId=getChildCount()-1;

    }

    moveToDest(destId);

    }

    /**

     * 将指定下标的图片移动至屏幕

     * @param destId    distance:图片需要移动的距离

     */

    public void moveToDest(int destId) {

    int distance = destId*getWidth()-getScrollX();

    scrollBy(distance, 0);

    }

    这样就可以实现ViewPager效果。但是这样还是比较生硬,这时候可以加一个在BaiHeTest中实现的动画效果。

    创建MyScroller对象,使用scroller代替scrollBy

    myScroller.startScroll(getScrollX(), getScrollY(), distance, 0,Math.abs(distance));

    invalidate();

    然后还得重写computeScroll()方法,设置mScroller滚动的位置时,并不会导致View的滚动,通常是用mScroller记录/计算View滚动的位置,再重写View的computeScroll(), 完成实际的滚动。

    public void computeScroll() {

    if(myScroller.computeScrollOffset()){

    int x = myScroller.getCurrX();

    scrollTo(x, 0);

    invalidate();

    }

    }

    computeScrollOffset()这个方法,如果动画还在执行就返回true,如果动画不执行了,就返回false。不断的移动和刷新。

    Le王冬冬 博客分享地址: http://www.cnblogs.com/dongdong230/ 每个人都应做一天攻城狮
  • 相关阅读:
    GDB调试共享库的问题
    Android 2.3 StageFright如何选定OMX组件的?
    Perforce client p4常见用法
    pthread_cond_signal只能唤醒已经处于pthread_cond_wait的线程
    正则表达式验证数据例子
    美国经济数据公布时间
    .net去除html标签代码
    js Array 方法|js Array 方法使用
    在分析向此请求提供服务所需资源时出错。请检查下列特定分析错误详细信息并适当地修改源文件
    日期格式正则表达式
  • 原文地址:https://www.cnblogs.com/dongdong230/p/4183044.html
Copyright © 2020-2023  润新知