Android – установить ProgressBar как вертикальную полосу вместо горизонтальной?

Я пытаюсь использовать ProgressBar в качестве показателя, например дисплея. Я думал, что это будет непростая задача, и подумал, что у ProgressBar есть свойство вертикали, но я ничего не вижу.

Кроме того, я хотел бы показать индикатор линейки, расположенный рядом со штангой, чтобы четко указать текущий уровень.

Указатели оценили – Спасибо!

По умолчанию вертикальные полосы выполнения не поддерживаются.

Недавно я столкнулся с необходимостью вертикального индикатора выполнения, но не смог найти решение, используя существующий виджет Progress Bar. Решения, с которыми я столкнулся, обычно требовали расширения текущей панели прогресса или совершенно нового classа в ней. Я не был убежден, что для развертывания нового classа требуется простое изменение ориентации.

В этой статье представлено простое, элегантное и, самое главное, решение без взлома для достижения вертикального индикатора выполнения. Я собираюсь пропустить объяснение и просто предоставить решение для резака для печенья. Если вам нужна дополнительная информация, вы можете связаться со мной или оставить комментарий ниже.

Создайте xml в выпадающей папке (не drawable-hdpi или drawable-mdpi – поместите его в drawable). В этом примере я вызываю свой xml vertical_progress_bar.xml

Вот что разместить в XML-файле:

                         

Создайте xml-файл с именем styles.xml и поместите его в res / values. Если ваш проект уже содержит styles.xml в res / values, пропустите этот шаг.

Измените файл styles.xml и добавьте следующий код в конец файла:

    

Добавьте свой новый вертикальный индикатор выполнения в свой макет. Вот пример:

  

Это должно быть все, что вам нужно сделать, чтобы использовать вертикальный индикатор выполнения в вашем проекте. Возможно, у вас могут быть пользовательские графические изображения с девятью патчами, которые вы используете для индикатора выполнения. Вы должны внести соответствующие изменения в файл progress_bar_vertical.xml. Надеюсь, это поможет вам в вашем проекте!

Вы должны создать свой собственный пользовательский индикатор прогресса.

В xml добавьте этот макет:

   

VerticalProgressBar.java

 public class VerticalProgressBar extends ProgressBar{ private int x, y, z, w; @Override protected void drawableStateChanged() { // TODO Auto-generated method stub super.drawableStateChanged(); } public VerticalProgressBar(Context context) { super(context); } public VerticalProgressBar(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } public VerticalProgressBar(Context context, AttributeSet attrs) { super(context, attrs); } protected void onSizeChanged(int w, int h, int oldw, int oldh) { super.onSizeChanged(h, w, oldh, oldw); this.x = w; this.y = h; this.z = oldw; this.w = oldh; } @Override protected synchronized void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(heightMeasureSpec, widthMeasureSpec); setMeasuredDimension(getMeasuredHeight(), getMeasuredWidth()); } protected void onDraw(Canvas c) { c.rotate(-90); c.translate(-getHeight(), 0); super.onDraw(c); } @Override public boolean onTouchEvent(MotionEvent event) { if (!isEnabled()) { return false; } switch (event.getAction()) { case MotionEvent.ACTION_DOWN: setSelected(true); setPressed(true); break; case MotionEvent.ACTION_MOVE: setProgress(getMax() - (int) (getMax() * event.getY() / getHeight())); onSizeChanged(getWidth(), getHeight(), 0, 0); break; case MotionEvent.ACTION_UP: setSelected(false); setPressed(false); break; case MotionEvent.ACTION_CANCEL: break; } return true; } @Override public synchronized void setProgress(int progress) { if (progress >= 0) super.setProgress(progress); else super.setProgress(0); onSizeChanged(x, y, z, w); } } 

Или: решение Jagsaund также прекрасно.

Я знаю, что это старый пост, но я нашел очень простое решение этой проблемы, которое может помочь кому-то. Сначала создайте файл progress_drawable_vertical.xml следующим образом:

              

Тогда просто используйте это в своем progressBar:

  

Я также создал progress_drawable_horizontal.xml

              

с целью выполнения mantain того же стиля, определенного в progress_drawable_vertical.xml

Ключевым моментом здесь является правильное использование android:clipOrientation и android:gravity .

Я нашел это решение здесь, и kernel ​​решения похоже на jagsaund, но немного более простое.

Я нашел, вероятно, лучшее (самое простое и универсальное) решение 🙂

Это старый пост, но мне было так сложно найти это так простое решение, поэтому я подумал, что должен опубликовать его.

Просто используйте scale-drawable (или 9-патч, если хотите), не нужно ЛЮБОГО ДРУГОГО кода.

Пример:

            

И, конечно, обычный код:

  

Обратите внимание на xml-строки, scale-drawable по scale-drawable (магические линии):

 android:scaleGravity="bottom" //scale from 0 in y axis (default scales from center Y) android:scaleWidth="0%" //don't scale width (according to 'progress') android:scaleHeight="100%" //do scale the height of the drawable 

Чтобы использовать ProgressBar и сделать его вертикальным, вам придется создать свой собственный пользовательский вид, расширяющий представление ProgressBar и переопределяя метод onDraw (). Это позволит вам рисовать его в обратной ориентации. Взгляните на исходный код ProgressBar.onDraw() (расположенный внизу ссылки) для получения справки о том, как это сделать. Лучший сценарий, вам просто придется поменять несколько переменных x и y.

Создание индикатора выполнения (я преобразовал свой код из c # в java, поэтому может быть не на 100% правильно)

 ProgressBar progBar = new ProgressBar(Context, null, Android.resource.attribute.progressDrawable); progBar.progressDrawable = ContextCompat.getDrawable(Context, resource.drawable.vertical_progress_bar); progBar.indeterminate = false; 

vertical_progress_bar.xml

             

vertical_progress_bar_blue_progress.xml

      

То, что сделает ваш вертикальный бар, – это scaleHeight и scaleGravity в vertical_progress_bar.xml .

В результате он выглядит примерно так:

введите описание изображения здесь

У меня есть точная проблема. Создание пользовательского classа (расширение ProgressBar) приведет к созданию кода, который трудно поддерживать. Использование пользовательского стиля вызовет проблему совместимости с другой темой из новой ОС (например, леденец)

В конце концов, я просто применил анимацию вращения к горизонтальной полосе хода. Вдохновленный Пит .

  1. Создайте тег в вашем макете xml, как обычный горизонтальный индикатор выполнения.
  2. Убедитесь, что размер и положение ProgressBar – это то, что вы хотите после вращения. (Возможно, установление отрицательной маржи поможет). В моем коде я поворачиваю представление из 0,0.
  3. Используйте метод ниже, чтобы повернуть и установить новый прогресс.

Код:

 private void setProgress(final ProgressBar progressBar, int progress) { progressBar.setWillNotDraw(true); progressBar.setProgress(progress); progressBar.setWillNotDraw(false); progressBar.invalidate(); } private void rotateView(final View v, float degree) { Animation an = new RotateAnimation(0.0f, degree); an.setDuration(0); an.setRepeatCount(0); an.setFillAfter(true); // keep rotation after animation v.setAnimation(an); } 

Простой просмотр изображения в прогребе

пример

 viewHolder.proBarTrueImage.setMaximalValue(147); viewHolder.proBarTrueImage.setLevel(45); viewHolder.proBarTrueImage.setColorResource(R.color.corner_blue); 

простой class

 public class ProgressImageView extends ImageView { private Context mContext; private Paint paint; private RectF rectf; private int maximalValue = 1; private int level = 0; private int width; private int height; public ProgressImageView(Context context) { super(context); init(context, null, 0); } public ProgressImageView(Context context, AttributeSet attrs) { super(context, attrs); init(context, attrs, 0); } public ProgressImageView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); init(context, attrs, defStyleAttr); } private void init(Context context, AttributeSet attrs, int defStyleAttr){ mContext = context; paint = new Paint(); rectf = new RectF(); paint.setColor(Color.GRAY); paint.setStyle(Paint.Style.FILL); }; @Override protected void onDraw(Canvas canvas) { float dif = (float) height / (float) maximalValue; int newHeight = height - (int) (dif * level); rectf.set(0,newHeight, width, height); canvas.drawRect(rectf, paint); super.onDraw(canvas); } @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { super.onSizeChanged(w, h, oldw, oldh); this.width = w; this.height = h; } public void setMaximalValue(int maximalValue) { this.maximalValue = maximalValue; invalidate(); } public void setLevel(int level) { this.level = level; invalidate(); } public void setColorResource(int color) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { color = mContext.getResources().getColor(color,mContext.getTheme()); }else { color = mContext.getResources().getColor(R.color.corner_blue); } setColor(color); } public void setColor(int color){ if (paint != null){ paint.setColor(color); invalidate(); } } 

}

 This perfectly works                 
  

Используйте андроид: rotation = «270» до 100%, как внизу вверх или андроид: rotation = «90» до 100%, как сверху вниз

  • Заголовок и нижний колонтитул RecyclerView
  • Кнопка удаления fragmentа кнопки Android Fragment
  • Отключить или запретить мультитач в действии
  • Обновление конфликта конфликтов для игровых сервисов 9.4.0 Android studio 2.2
  • Какова цель тега Android в XML-макетах?
  • Android настроил Volley для использования в кеше
  • автоматическая установка apk
  • Как сохранить состояние во время изменения ориентации в Android, если состояние сделано из моих classов?
  • Отключить анимацию анимации активности при запуске новой активности?
  • Как показать Dialog в методе onCreate?
  • Уникальный идентификатор Android-устройства
  • Давайте будем гением компьютера.