Android上类似于iOS相机滑动切换的View

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/myfather103/article/details/76695199

项目地址:
https://github.com/duxingzhe/ios-camera-scrollerview-in-android
苹果相机有一个功能就是左右切换拍摄模式,左右滑动就可以切换。然而,目前的问题是如果使用了View和Fragment之后相机打开是有异常的,所以不能使用这种方式。
于是只好反编译其他实现了这种功能的相机,得到线索是,有一个自定义的BottomView,BottomView中加载了一个自定义的ViewGroup,里面有一个ViewGroup。在ViewGroup中定义了三个TextView,然后设置居中,字号等样式。
在自定义的CameraScrollerView中,先设置好初始化的选择效果

protected void onLayout(boolean changed, int left,int top,int right, int bottom){
    int cCount = getChildCount();
    int childLeft=0;
    int childRight=0;
    int selectedMode=Util.getCurrentSelectedIndex();
    int widthOffset=0;//居中显示
    /**
     * 遍历所有childView根据其宽和高,不考虑margin
     */
    for(int i=0;i<cCount;i++){
        View childView = getChildAt(i);
        if(i<selectedMode){
            widthOffset+=childView.getMeasuredWidth();
        }
    }

    for (int i = 0; i < cCount; i++)
    {
        View childView = getChildAt(i);
        if(i!=0){
            View preView=getChildAt(i-1);
            childLeft=preView.getRight();
            childRight=childLeft+childView.getMeasuredWidth();
        }else{
            //getChildAt(0).getMeasuredWidth()应该被替换为被确认的值,循环计算。
            childLeft=(getWidth()-getChildAt(selectedMode).getMeasuredWidth())/2-widthOffset;
            childRight=childLeft+childView.getMeasuredWidth();
        }
        childView.layout(childLeft, top, childRight, bottom);
    }

    TextView indexText=(TextView)getChildAt(selectedMode);          
    indexText.setTextColor(getResources().getColor(R.color.chosenTextColor));
}

然后这是滑动设置的效果

public final void scrollToNext(int preIndex, int nextIndex){
    TextView selectedText=(TextView)getChildAt(preIndex);
    if(selectedText!=null){
        selectedText.setTextColor(getResources().getColor(R.color.black));
    }
    selectedText=(TextView)getChildAt(nextIndex);
    if(selectedText!=null){
        selectedText.setTextColor(getResources().getColor(R.color.chosenTextColor));
    }
}

public void computeScroll(){
    if(mScroller.computeScrollOffset()){
        scrollTo(mScroller.getCurrX(),mScroller.getCurrY());
        invalidate();
    }
    super.computeScroll();
}

在BottomView中左右滑动的设置为

public void moveLeft(){
    CameraScroller cameraScroller=mCameraScroller;
    cameraScroller.leftIndex=Util.getCurrentSelectedIndex()-1;
    cameraScroller.rightIndex=Util.getCurrentSelectedIndex();
    int k=Math.round((cameraScroller.getChildAt(cameraScroller.leftIndex).getWidth()+cameraScroller.getChildAt(cameraScroller.rightIndex).getWidth())/2.0F);
    cameraScroller.mScroller.startScroll(cameraScroller.getScrollX(),0,-k,0,cameraScroller.duration);
    cameraScroller.scrollToNext(cameraScroller.rightIndex,cameraScroller.leftIndex);
    Util.setSelectedIndex(Util.getCurrentSelectedIndex()-1);
    cameraScroller.invalidate();

}

public void moveRight(){
    CameraScroller cameraScroller=mCameraScroller;
    cameraScroller.leftIndex=Util.getCurrentSelectedIndex();
    cameraScroller.rightIndex=Util.getCurrentSelectedIndex()+1;
    int k=Math.round((cameraScroller.getChildAt(cameraScroller.leftIndex).getWidth()+cameraScroller.getChildAt(cameraScroller.rightIndex).getWidth())/2.0F);
    cameraScroller.mScroller.startScroll(cameraScroller.getScrollX(),0,k,0,cameraScroller.duration);
    cameraScroller.scrollToNext(cameraScroller.leftIndex,cameraScroller.rightIndex);
    Util.setSelectedIndex(Util.getCurrentSelectedIndex()+1);
    cameraScroller.invalidate();
}

在初始化的时候,注意:

public BottomView(Context context, AttributeSet attrs){
    super(context,attrs);
    mContext=context;
    LayoutInflater.from(context).inflate(R.layout.camera_scroller_layout,this,true);
}

则效果为如下图所示:
这里写图片描述
这里写图片描述

展开阅读全文

没有更多推荐了,返回首页