android camera拍照录像切换功能

滑动选择拍照或录像组件实现相关

通过自定义view组件实现滑动切换的效果,继承重写view的构造方法进行相关初始化:

public HorizontalSelectedView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
    this.context = context;
    setWillNotDraw(false);
    setClickable(true);
    initAttrs(attrs);//初始化属性
    initPaint();//初始化画笔
}
/**
* 初始化画笔
*/
private void initPaint() {
    textPaint = new TextPaint(Paint.ANTI_ALIAS_FLAG);
    textPaint.setTextSize(textSize);
    textPaint.setColor(textColor);
    selectedPaint = new TextPaint(Paint.ANTI_ALIAS_FLAG);
    selectedPaint.setColor(selectedColor);
    selectedPaint.setTextSize(selectedTextSize);
}

/**
* 初始化属性
* @param attrs
*/
@SuppressLint("RestrictedApi")
private void initAttrs(AttributeSet attrs) {
    @SuppressLint("RestrictedApi") TintTypedArray tta = TintTypedArray.obtainStyledAttributes(getContext(), attrs,
                                                                                              R.styleable.HorizontalSelectedView);
    //两种字体颜色和字体大小S
    seeSize = tta.getInteger(R.styleable.HorizontalSelectedView_HorizontalSelectedViewSeeSize, 4);
    selectedTextSize = 47;
    textSize = 47;
    selectedColor = tta.getColor(R.styleable.HorizontalSelectedView_HorizontalSelectedViewSelectedTextColor, context.getResources().getColor(android.R.color.black));
    //textSize = tta.getFloat(R.styleable.HorizontalSelectedView_HorizontalSelectedViewTextSize, 400);
    textColor = tta.getColor(R.styleable.HorizontalSelectedView_HorizontalSelectedViewTextColor, context.getResources().getColor(android.R.color.darker_gray));
}

重写onDraw方法对画面进行重绘:

@Override
protected void onDraw(Canvas canvas) {

    @SuppressLint("DrawAllocation")
    Paint paint_1=new Paint(); //绘制文本框画笔
    paint_1.setAntiAlias(true); //使用抗锯齿功能
    paint_1.setStyle(Paint.Style.STROKE);
    paint_1.setStrokeWidth(3);
    paint_1.setColor(Color.GRAY); //设置画笔颜色

    //控件宽度
    int width = getWidth();
    //控件高度
    int height = getHeight();

    super.onDraw(canvas);
    if (firstVisible) {
        anInt = width / 8;
        n = n - 1;//向右移动一个单元
        firstVisible = false;
    }
    if (n >= 0 && n <= strings.size() - 1) {//加个保护;防止越界

        String s = strings.get(n);//得到被选中的文字
        /**
             * 得到被选中文字 绘制时所需要的宽高
             */
        selectedPaint.getTextBounds(s, 0, s.length(), rect);
        selectedPaint.setColor(Color.CYAN);
        //从矩形区域中读出文本内容的宽高
        int centerTextWidth = rect.width();
        int centerTextHeight = rect.height();
        canvas.drawText(strings.get(n), getWidth() / 2f - centerTextWidth / 2f + anOffset, getHeight() / 2f + centerTextHeight / 2f, selectedPaint);//绘制被选中文字,注意点是y坐标

        for (int i = 0; i < strings.size(); i++) {//遍历strings,把每个地方都绘制出来,
            if (n > 0 && n < strings.size() - 1) {//这里主要是因为strings数据源的文字长度不一样,为了让被选中两边文字距离中心宽度一样,我们取得左右两个文字长度的平均值
                textPaint.getTextBounds(strings.get(n - 1), 0, strings.get(n - 1).length(), rect);
                int width1 = rect.width();
                textPaint.getTextBounds(strings.get(n + 1), 0, strings.get(n + 1).length(), rect);
                int width2 = rect.width();
                textWidth = (width1 + width2) / 2;
            }
            if (i == 0) {//得到高,高度是一样的,所以无所谓
                textPaint.getTextBounds(strings.get(0), 0, strings.get(0).length(), rect);
                textHeight = rect.height();
            }

            if (i != n) {
                if (strings.size() == 2 && i == 0){
                    canvas.drawText(strings.get(i), (i - n) * anInt + getWidth() / 2f - textWidth / 2f + anOffset - 90, getHeight() / 2f + textHeight / 2f, textPaint);//画出每组文字

                }else {
                    canvas.drawText(strings.get(i), (i - n) * anInt + getWidth() / 2f - textWidth / 2f + anOffset, getHeight() / 2f + textHeight / 2f, textPaint);//画出每组文字

                }
            }
        }
    }

}

onTouchEvnet方法中监听触摸点击事件实现切换效果:

@Override
public boolean onTouchEvent(MotionEvent event) {
    switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:
            downX = event.getX();//获得点下去的x坐标
            break;
        case MotionEvent.ACTION_MOVE://复杂的是移动时的判断
            float scrollX = event.getX();

            if (n != 0 && n != strings.size() - 1)
                anOffset = scrollX - downX;//滑动时的偏移量,用于计算每个是数据源文字的坐标值
            else {
                anOffset =(float) ((scrollX - downX) / 1.5);//当滑到两端的时候添加一点阻力
            }

            if (scrollX > downX) {
                //向右滑动,当滑动距离大于每个单元的长度时,则改变被选中的文字。
                if (scrollX - downX >= anInt) {
                    if (n > 0) {
                        anOffset = 0;
                        n = n - 1;
                        downX = scrollX;
                    }
                }
            } else {
                //向左滑动,当滑动距离大于每个单元的长度时,则改变被选中的文字。
                if (downX - scrollX >= anInt) {

                    if (n < strings.size() - 1) {
                        anOffset = 0;
                        n = n + 1;
                        downX = scrollX;
                    }
                }
            }
            invalidate();
            break;
        case MotionEvent.ACTION_UP:
            //抬起手指时,偏移量归零,相当于回弹。
            anOffset = 0;
            invalidate();
            break;
        default:
            break;
    }
    return super.onTouchEvent(event);
}
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值