滑动选择拍照或录像组件实现相关
通过自定义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);
}