首页 > 编程知识 正文

android设置开关控件,android 自定义组件

时间:2023-05-04 15:47:45 阅读:177373 作者:3323

今天实现上图的音量调节效果。 主要通过两种实现方式定制RatingBar和自定义View。 爱撒娇的银耳汤ratingbarvolume _ rating.XML main.XML/p Android 3360 id=' @ id/volume _ rating bar ' Android : layout _ width=' wrap _ content ' Android 3360 layout _ height=' wrap _ content ' andrd n droid : visibility=' gone ' Android 3360 padding top=' 20 dip ' adding top=' 20 droid : progress drawable=' @ drawable/layer-list的Drawable必须是图片:爱撒娇的银耳汤view attrs.XML/pjsdmyppublicclassvolumeviewextendsview { privatepaintpaint; //控制宽度private int width=430; //控制高度private int height=100;//两个音量矩形最左边之间的间隔private int rectMargin=10; //音量矩形高private int rectH=30; //音量矩形宽度private int rectW=15; //未选择体积颜色private int unchoicevolumecolor//体积颜色private int choiceVolumeColor; //当前音量private int currentVolume; //最大音量private int maxVolume; //音量减少-左坐标private int minusLeft; //音量减少-右坐标private int minusRight; //音量加-左坐标private int plusLeft; //音量加-右坐标private int plusRight; //音量图标private Bitmap volumeIcon; //音量图标private Bitmap volumeCloseIcon; //降低音量图标private Bitmap minusIcon; //提高音量图标private Bitmap plusIcon; privateonvolumechangedlisteneronvolumechangedlistener publicvolumeview (上下文上下文) this (上下文,null ); } publicvolumeview (context context,@Nullable AttributeSet attrs ) this ) context,attrs,0 ); } publicvolumeview (context context,@Nullable AttributeSet attrs,int defStyleAttr ) super ) context,attrs,defstyleatttr=typed array.getcolor (r.style able.vol

umeView_volumeColor, Color.BLACK);typedArray.recycle();paint = new Paint();volumeIcon = BitmapFactory.decodeResource(getResources(), R.drawable.volume);}public void setOnVolumeChangedListener(OnVolumeChangedListener onVolumeChangedListener) {this.onVolumeChangedListener = onVolumeChangedListener;}@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);if (onVolumeChangedListener != null) {onVolumeChangedListener.onVolumenChanged(currentVolume);}if (currentVolume == 0) {canvas.drawBitmap(volumeCloseIcon, 0, 0, paint);} else {canvas.drawBitmap(volumeIcon, 0, 0, paint);}int iconWidth = volumeIcon.getWidth();int iconHeight = volumeIcon.getHeight();int offsetTop = (iconHeight - minusIcon.getHeight()) / 2;int offsetLeft = iconWidth kqdxn;minusLeft = iconWidth;canvas.drawBitmap(minusIcon, offsetLeft, offsetTop, paint);int offsetVolumeLeft = offsetLeft + minusIcon.getWidth() kqdxn;minusRight = offsetVolumeLeft;int offsetVolumeTop = (iconHeight - rectH) / 2;paint.setColor(choiceVolumeColor);for (int i = 0; i < currentVolume; i++) {int left = offsetVolumeLeft + i * rectW + i * rectMargin;canvas.drawRect(left, offsetVolumeTop, left + rectW, offsetVolumeTop + rectH, paint);}paint.setColor(unChoiceVolumeColor);for (int i = currentVolume; i < maxVolume; i++) {int left = offsetVolumeLeft + i * rectW + i * rectMargin;canvas.drawRect(left, offsetVolumeTop, left + rectW, offsetVolumeTop + rectH, paint);}int offsetPlusTop = (iconHeight - plusIcon.getHeight()) / 2;int offsetPlusLeft = offsetVolumeLeft + maxVolume * rectW + maxVolume * rectMargin + rectMargin;plusLeft = offsetVolumeLeft + maxVolume * rectW + (maxVolume - 1) * rectMargin;plusRight = offsetPlusLeft + plusIcon.getWidth() + rectMargin;canvas.drawBitmap(plusIcon, offsetPlusLeft, offsetPlusTop, paint);}public void addVolume() {if (currentVolume >= maxVolume) {return;}invalidate();}public void minusVolume() {if (currentVolume <= 0) {return;}invalidate();}@Overridepublic boolean onTouchEvent(MotionEvent event) {if (event.getAction() == MotionEvent.ACTION_DOWN) {float eventX = event.getX();if (eventX >= minusLeft && eventX <= minusRight) {//minusVolumeminusVolume();return true;} else if (eventX >= plusLeft && eventX <= plusRight) {//addVolumeaddVolume();return true;}}return super.onTouchEvent(event);}public interface OnVolumeChangedListener {}}MainActivity.javavolumeView.setOnVolumeChangedListener(volume -> {tvCurVolume.setText("当前音量:" + volume);});这里也注意下,Bitmap plusIcon = BitmapFactory.decodeResource(getResources(), R.drawable.plus);同样不能用自己画的shape,原因不详。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。