AndroAid 在attrs.xml添加属性时出现 Found item Attr/****** more than one time

2023-12-13 03:10

本文主要是介绍AndroAid 在attrs.xml添加属性时出现 Found item Attr/****** more than one time,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

     

      在自定义圆形进度条类中使用到attrs.xml,出现多个自定义类引用多个属性,运行时attrs.xml报了错误,其实就是你的attrs.xml中有同名的属性(比如颜色的name),修改一下属性名称就可以了:

 

<?xml version="1.0" encoding="utf-8"?>
<resources><!--圆弧进度条--><declare-styleable name="TasksCompletedView"><attr name="radius" format="dimension"/><attr name="strokeWidth" format="dimension"/><attr name="circleColor" format="color"/><attr name="ringColor" format="color"/><attr name="ringBgColor" format="color"/></declare-styleable><!--圆弧进度条2--><declare-styleable name="circleProgressBar"><attr name="circleWidth" format="dimension" /><attr name="betaAngle" format="integer" /><attr name="firstColor" format="color" /><attr name="secondColor" format="color" /></declare-styleable><!--圆弧进度条3--><declare-styleable name="CircleProgressView"><!--画笔宽度--><attr name="progress_width" format="dimension" /><!--画笔颜色--><attr name="progress_color" format="color" /><!--加载进度起始位置--><attr name="location_start" format="enum"><enum name="left" value="1" /><enum name="top" value="2" /><enum name="right" value="3" /><enum name="bottom" value="4" /></attr></declare-styleable><!--圆弧进度条4--><declare-styleable name="CircularProgressView"><attr name="ringWidth" format="dimension" /><attr name="ringColors" format="color" /><attr name="progressTitle" format="string" /></declare-styleable></resources>

自定义圆形进度条类: 

package com.apeng.utils;import android.animation.ValueAnimator;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.RectF;
import android.support.annotation.Nullable;
import android.util.AttributeSet;
import android.view.View;
import android.view.animation.LinearInterpolator;import com.apeng.ffmpegandroiddemo.R;/*** 普通环形进度条*/
public class CircleProgressBar3 extends View {private int mCurrent;//当前进度private Paint mBgPaint;//背景弧线paintprivate Paint mProgressPaint;//进度Paintprivate float mProgressWidth;//进度条宽度private int mProgressColor = Color.RED;//进度条颜色private int locationStart;//起始位置private float startAngle;//开始角度private ValueAnimator mAnimator;private int mMaxStepNum;//默认最大步数(最大值)public static String GOAL_STEP;public CircleProgressBar3(Context context) {this(context, null);}public CircleProgressBar3(Context context, @Nullable AttributeSet attrs) {this(context, attrs, 0);}public CircleProgressBar3(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);init(context, attrs);}private void init(Context context, AttributeSet attrs) {TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.CircleProgressView);locationStart = typedArray.getInt(R.styleable.CircleProgressView_location_start, 1);mProgressWidth = typedArray.getDimension(R.styleable.CircleProgressView_progress_width, dp2px(context, 4));mProgressColor = typedArray.getColor(R.styleable.CircleProgressView_progress_color, mProgressColor);typedArray.recycle();//背景圆弧mBgPaint = new Paint();mBgPaint.setAntiAlias(true);mBgPaint.setStrokeWidth(mProgressWidth);mBgPaint.setStyle(Paint.Style.STROKE);mBgPaint.setColor(Color.parseColor("#eaecf0"));mBgPaint.setStrokeCap(Paint.Cap.ROUND);//进度圆弧mProgressPaint = new Paint();mProgressPaint.setAntiAlias(true);mProgressPaint.setStyle(Paint.Style.STROKE);mProgressPaint.setStrokeWidth(mProgressWidth);mProgressPaint.setColor(mProgressColor);mProgressPaint.setStrokeCap(Paint.Cap.ROUND);//进度条起始角度if (locationStart == 1) {//左startAngle = -180;} else if (locationStart == 2) {//上startAngle = -90;} else if (locationStart == 3) {//右startAngle = 0;} else if (locationStart == 4) {//下startAngle = 90;}}@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {int width = MeasureSpec.getSize(widthMeasureSpec);int height = MeasureSpec.getSize(heightMeasureSpec);int size = width < height ? width : height;setMeasuredDimension(size, size);}/*** oval  // 绘制范围* startAngle  // 开始角度* sweepAngle  // 扫过角度* useCenter   // 是否使用中心*/@Overrideprotected void onDraw(Canvas canvas) {//绘制背景圆弧RectF rectF = new RectF(mProgressWidth / 2, mProgressWidth / 2, getWidth() - mProgressWidth / 2, getHeight() - mProgressWidth / 2);canvas.drawArc(rectF, 0, 360, false, mBgPaint);//绘制当前进度float sweepAngle = 360 * mCurrent / mMaxStepNum;canvas.drawArc(rectF, startAngle, sweepAngle, false, mProgressPaint);}public int getCurrent() {return mCurrent;}/*** 设置进度** @param current*/public void setCurrent(int current) {mCurrent = current;invalidate();}/*** @param stepNum*/public void setMaxStepNum(int stepNum) {mMaxStepNum = stepNum;GOAL_STEP = String.valueOf(mMaxStepNum);}private int tCurrent = -1;/*** 动画效果** @param current  精度条进度:0-100* @param duration 动画时间*/public void startAnimProgress(int current, int duration) {mAnimator = ValueAnimator.ofInt(0, current);mAnimator.setDuration(duration);mAnimator.setInterpolator(new LinearInterpolator());mAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {@Overridepublic void onAnimationUpdate(ValueAnimator animation) {int current = (int) animation.getAnimatedValue();if (tCurrent != current) {tCurrent = current;setCurrent(current);if (mOnAnimProgressListener != null)mOnAnimProgressListener.valueUpdate(current);}}});mAnimator.start();}public interface OnAnimProgressListener {void valueUpdate(int progress);}private OnAnimProgressListener mOnAnimProgressListener;/*** 监听进度条进度** @param onAnimProgressListener*/public void setOnAnimProgressListener(OnAnimProgressListener onAnimProgressListener) {mOnAnimProgressListener = onAnimProgressListener;}public void destroy() {if (mAnimator != null) {mAnimator.cancel();}}public static int dp2px(Context context, float dpValue) {final float scale = context.getResources().getDisplayMetrics().density;return (int) (dpValue * scale + 0.5f);}
}

布局:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:lh2="http://schemas.android.com/apk/res/com.apeng.ffmpegandroiddemo"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:background="@color/_6FA0F8"tools:ignore="ResAuto"><RelativeLayoutandroid:id="@+id/rl"android:layout_marginTop="30dp"android:layout_width="match_parent"android:layout_height="wrap_content"><com.apeng.utils.CircleProgressBar3android:id="@+id/color_progress_view"android:layout_width="180dp"android:layout_height="180dp"android:layout_centerHorizontal="true" /><TextViewandroid:id="@+id/tv_progress"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_centerInParent="true"android:layout_centerVertical="true"android:text="0" /></RelativeLayout><LinearLayoutandroid:layout_width="match_parent"android:layout_height="90dp"android:layout_below="@+id/rl"android:gravity="center"android:orientation="horizontal"><Buttonandroid:id="@+id/btn_start"android:layout_width="wrap_content"android:layout_height="54dp"android:layout_margin="12dp"android:text="开始" /><Buttonandroid:id="@+id/btn_reset"android:layout_width="wrap_content"android:layout_height="54dp"android:layout_margin="12dp"android:text="重置" /></LinearLayout><SeekBarandroid:id="@+id/seekbar"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_alignParentBottom="true"android:layout_marginBottom="40dp"android:layout_marginLeft="10dp"android:layout_marginRight="10dp"android:background="#778899"android:max="50" /></RelativeLayout>

主函数代码:

package com.apeng.ffmpegandroiddemo;import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.SeekBar;
import android.widget.TextView;
import com.apeng.utils.CircleProgressBar3;
import com.hjq.permissions.OnPermission;
import com.hjq.permissions.XXPermissions;
import java.util.List;/*** @author sgf* https://github.com/Hellobird/CircleSeekBar-For-Android*/
public class CircleProgressBar3Activity extends AppCompatActivity  implements View.OnClickListener{private CircleProgressBar3 circle_progress;private TextView tv_progress;private Button btn_start;private Button btn_reset;private SeekBar seekbar;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_circleprogressbar3);getPermissions();initView();}private void initView() {//自定义圆形进度条btn_start = (Button) findViewById(R.id.btn_start);btn_reset = (Button) findViewById(R.id.btn_reset);circle_progress = (CircleProgressBar3) findViewById(R.id.color_progress_view);tv_progress = (TextView) findViewById(R.id.tv_progress);circle_progress.setMaxStepNum(200);//设置最大值btn_start.setOnClickListener(this);btn_reset.setOnClickListener(this);seekbar = (SeekBar) findViewById(R.id.seekbar);seekbar.setMax(200);//手动控制progressseekbar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener(){@Overridepublic void onStopTrackingTouch(SeekBar seekBar){}@Overridepublic void onStartTrackingTouch(SeekBar seekBar){}@Overridepublic void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser){if (fromUser){circle_progress.setCurrent(progress);//                    color_progress_view.setProgress(progress); //不使用动画
//                    circleProgressBar.setProgress(progress, true); // 使用数字过渡动画}}});}@Overrideprotected void onDestroy() {super.onDestroy();if (circle_progress != null) {circle_progress.destroy();}}@Overrideprotected void onResume() {super.onResume();}/*** @dec 一句代码搞定权限问题* @author apeng* @date 2018/10/31 10:54*/public void getPermissions() {XXPermissions.with(this).constantRequest() //可设置被拒绝后继续申请,直到用户授权或者永久拒绝.permission("android.permission.READ_EXTERNAL_STORAGE", "android.permission.WRITE_EXTERNAL_STORAGE").request(new OnPermission() {@Overridepublic void hasPermission(List<String> granted, boolean isAll) {}@Overridepublic void noPermission(List<String> denied, boolean quick) {}});}@Overridepublic void onClick(View view) {switch (view.getId()) {case R.id.btn_start://开锁执行动画效果circle_progress.startAnimProgress(200, 1200);//监听进度条进度circle_progress.setOnAnimProgressListener(new CircleProgressBar3.OnAnimProgressListener() {@Overridepublic void valueUpdate(int progress) {tv_progress.setText(String.valueOf(progress));}});break;case R.id.btn_reset:circle_progress.setCurrent(0);tv_progress.setText("0");break;}}
}

上面是一个完整的案例,复制即可实现效果。

这篇关于AndroAid 在attrs.xml添加属性时出现 Found item Attr/****** more than one time的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/486936

相关文章

JavaScript中的isTrusted属性及其应用场景详解

《JavaScript中的isTrusted属性及其应用场景详解》在现代Web开发中,JavaScript是构建交互式应用的核心语言,随着前端技术的不断发展,开发者需要处理越来越多的复杂场景,例如事件... 目录引言一、问题背景二、isTrusted 属性的来源与作用1. isTrusted 的定义2. 为

MySQL中时区参数time_zone解读

《MySQL中时区参数time_zone解读》MySQL时区参数time_zone用于控制系统函数和字段的DEFAULTCURRENT_TIMESTAMP属性,修改时区可能会影响timestamp类型... 目录前言1.时区参数影响2.如何设置3.字段类型选择总结前言mysql 时区参数 time_zon

在MyBatis的XML映射文件中<trim>元素所有场景下的完整使用示例代码

《在MyBatis的XML映射文件中<trim>元素所有场景下的完整使用示例代码》在MyBatis的XML映射文件中,trim元素用于动态添加SQL语句的一部分,处理前缀、后缀及多余的逗号或连接符,示... 在MyBATis的XML映射文件中,<trim>元素用于动态地添加SQL语句的一部分,例如SET或W

Python xmltodict实现简化XML数据处理

《Pythonxmltodict实现简化XML数据处理》Python社区为提供了xmltodict库,它专为简化XML与Python数据结构的转换而设计,本文主要来为大家介绍一下如何使用xmltod... 目录一、引言二、XMLtodict介绍设计理念适用场景三、功能参数与属性1、parse函数2、unpa

关于Maven中pom.xml文件配置详解

《关于Maven中pom.xml文件配置详解》pom.xml是Maven项目的核心配置文件,它描述了项目的结构、依赖关系、构建配置等信息,通过合理配置pom.xml,可以提高项目的可维护性和构建效率... 目录1. POM文件的基本结构1.1 项目基本信息2. 项目属性2.1 引用属性3. 项目依赖4. 构

Java如何通过反射机制获取数据类对象的属性及方法

《Java如何通过反射机制获取数据类对象的属性及方法》文章介绍了如何使用Java反射机制获取类对象的所有属性及其对应的get、set方法,以及如何通过反射机制实现类对象的实例化,感兴趣的朋友跟随小编一... 目录一、通过反射机制获取类对象的所有属性以及相应的get、set方法1.遍历类对象的所有属性2.获取

Python 标准库time时间的访问和转换问题小结

《Python标准库time时间的访问和转换问题小结》time模块为Python提供了处理时间和日期的多种功能,适用于多种与时间相关的场景,包括获取当前时间、格式化时间、暂停程序执行、计算程序运行时... 目录模块介绍使用场景主要类主要函数 - time()- sleep()- localtime()- g

使用Python实现批量访问URL并解析XML响应功能

《使用Python实现批量访问URL并解析XML响应功能》在现代Web开发和数据抓取中,批量访问URL并解析响应内容是一个常见的需求,本文将详细介绍如何使用Python实现批量访问URL并解析XML响... 目录引言1. 背景与需求2. 工具方法实现2.1 单URL访问与解析代码实现代码说明2.2 示例调用

如何使用 Bash 脚本中的time命令来统计命令执行时间(中英双语)

《如何使用Bash脚本中的time命令来统计命令执行时间(中英双语)》本文介绍了如何在Bash脚本中使用`time`命令来测量命令执行时间,包括`real`、`user`和`sys`三个时间指标,... 使用 Bash 脚本中的 time 命令来统计命令执行时间在日常的开发和运维过程中,性能监控和优化是不

vue如何监听对象或者数组某个属性的变化详解

《vue如何监听对象或者数组某个属性的变化详解》这篇文章主要给大家介绍了关于vue如何监听对象或者数组某个属性的变化,在Vue.js中可以通过watch监听属性变化并动态修改其他属性的值,watch通... 目录前言用watch监听深度监听使用计算属性watch和计算属性的区别在vue 3中使用watchE