डिफ़ॉल्ट रूप से ProgressBar में बार के ऊपर और नीचे एक निश्चित पैडिंग होती है। क्या इस पैडिंग को हटाने का कोई तरीका है ताकि अंत में केवल बार हो?
android:minHeight="4dp"
डिफ़ॉल्ट रूप से ProgressBar में बार के ऊपर और नीचे एक निश्चित पैडिंग होती है। क्या इस पैडिंग को हटाने का कोई तरीका है ताकि अंत में केवल बार हो?
android:minHeight="4dp"
जवाबों:
मैं इस समस्या के लिए समाधान के रूप में निम्न का उपयोग करता हूं।
android:layout_marginBottom="-8dp"
android:layout_marginTop="-4dp"
android:layout_marginTop="-6dp"
मेरे लिए काम किया। आश्चर्य है कि क्या यह डिवाइस पर निर्भर है? मैंने केवल Xperia Z1
इस तरह से मैंने जुओज़ा के उत्तर का उपयोग किया:
मेरी ऊंचाई ProgressBar
4dp है। तो मैं एक बनाया FrameLayout
ऊंचाई 4dp साथ और सेट layout_gravity
के ProgressBar
लिए center
। यह एक आकर्षण की तरह काम करता है।
<FrameLayout
android:layout_width="match_parent"
android:layout_height="4dp">
<ProgressBar
style="?android:attr/progressBarStyleHorizontal"
android:layout_width="match_parent"
android:layout_height="4dp"
android:layout_gravity="center"
android:indeterminate="true"/>
</FrameLayout>
मैंने इस समस्या को हल करने के लिए एक कस्टम लाइब्रेरी का उपयोग किया। अधिकांश अन्य समाधान काम करते हैं लेकिन परिणाम विभिन्न उपकरणों के अनुरूप नहीं होते हैं।
MaterialProgressBar
- Android 4.0+ पर लगातार उपस्थिति।
- प्लेटफार्मों के पार सही टिनिंग।
- प्रोग्रेसबार के ढांचे की आंतरिक पैडिंग को हटाने में सक्षम।
- क्षैतिज क्षैतिज प्रोग्रेसबार के ढांचे को छिपाने में सक्षम।
- ProgressBar के लिए एक ड्रॉप-इन प्रतिस्थापन के रूप में उपयोग किया जाता है।
एक निर्भरता के रूप में जोड़ने के लिए:
compile 'me.zhanghai.android.materialprogressbar:library:1.1.7'
अपने लेआउट में बिना आंतरिक पैडिंग के एक ProgressBar जोड़ने के लिए:
<me.zhanghai.android.materialprogressbar.MaterialProgressBar
android:layout_width="wrap_content"
android:layout_height="4dp"
android:indeterminate="true"
app:mpb_progressStyle="horizontal"
app:mpb_useIntrinsicPadding="false"
style="@style/Widget.MaterialProgressBar.ProgressBar.Horizontal" />
app:mpb_useIntrinsicPadding="false"
उसने चाल चली। अधिक जानकारी के लिए GitHub पेज देखें ।
अगर किसी को अभी भी मदद चाहिए तो यह कोशिश कर सकते हैं:
<androidx.core.widget.ContentLoadingProgressBar
android:id="@+id/progress"
android:layout_width="match_parent"
android:layout_height="wrap_content"
style="@style/Widget.AppCompat.ProgressBar.Horizontal"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="@+id/guideline"
android:indeterminate="true"
android:visibility="visible"
app:layout_constraintBottom_toTopOf="@+id/guideline" />
यहाँ, प्रगति पट्टी ConstraintLayout के अंदर है , और constraintTop_toTopOf और constraintBottom_toTopOf विशेषताओं को एक ही तत्व पर लागू किया जाना चाहिए (इस मामले में, यह दिशानिर्देश है)।
*** पूरा समाधान: ***
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="48dp">
<View
android:id="@+id/guideline"
android:layout_width="0dp"
android:layout_height="0dp"
android:orientation="vertical"
android:visibility="invisible"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" />
<ProgressBar
android:id="@+id/progress_bar"
style="?android:attr/progressBarStyleHorizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:indeterminate="true"
app:layout_constraintBottom_toTopOf="@+id/guideline"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="@+id/guideline" />
</androidx.constraintlayout.widget.ConstraintLayout>
माता-पिता के अंदर लंबवत केंद्रित प्रोग्रेसबेर खींचना संभव है जो पैडिंग को दूर करेगा। चूंकि ProgressBar स्वयं को माता-पिता से बड़ा नहीं बना सकता, इसलिए हमें क्लिपिंग दृश्य के अंदर रखने के लिए एक बड़ा माता-पिता बनाना होगा।
<FrameLayout
android:id="@+id/clippedProgressBar"
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="4dp"
tools:ignore="UselessParent">
<FrameLayout
android:layout_width="match_parent"
android:layout_height="16dp"
android:layout_gravity="center_vertical">
<ProgressBar
style="?android:attr/progressBarStyleHorizontal"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:indeterminate="true"/>
</FrameLayout>
</FrameLayout>
की लंबवत गद्दी को हटाने के लिए ProgressBar
, आप कर सकते हैं
ProgressBar
उदाहरण में 1 wra_content ProgressBar
, 1 8dp ProgressBar
, 1 100dp शामिल हैProgressBar
<ProgressBar
style="?android:attr/progressBarStyleHorizontal"
...
android:layout_height="8dp"
android:scaleY="2" />
इस समस्या का पूर्ण समाधान निम्नानुसार होगा। बस अगर किसी को कोड के टुकड़े चाहिए होते हैं, तो यही मैंने किया।
यहां प्रगति_indeterminate_horiolet_holo.xml है
<animation-list
xmlns:android="http://schemas.android.com/apk/res/android"
android:oneshot="false">
<item android:drawable="@drawable/progressbar_indeterminate_holo1" android:duration="50" />
<item android:drawable="@drawable/progressbar_indeterminate_holo2" android:duration="50" />
<item android:drawable="@drawable/progressbar_indeterminate_holo3" android:duration="50" />
<item android:drawable="@drawable/progressbar_indeterminate_holo4" android:duration="50" />
<item android:drawable="@drawable/progressbar_indeterminate_holo5" android:duration="50" />
<item android:drawable="@drawable/progressbar_indeterminate_holo6" android:duration="50" />
<item android:drawable="@drawable/progressbar_indeterminate_holo7" android:duration="50" />
<item android:drawable="@drawable/progressbar_indeterminate_holo8" android:duration="50" />
शैली संसाधन मेरी स्थानीय शैलियों फ़ाइल में कॉपी किए गए हैं।
<style name="Widget">
<item name="android:textAppearance">@android:attr/textAppearance</item>
</style>
<style name="Widget.ProgressBar">
<item name="android:indeterminateOnly">true</item>
<item name="android:indeterminateBehavior">repeat</item>
<item name="android:indeterminateDuration">3500</item>
</style>
<style name="Widget.ProgressBar.Horizontal">
<item name="android:indeterminateOnly">false</item>
<item name="android:indeterminateDrawable">@drawable/progress_indeterminate_horizontal_holo</item>
</style>
और अंत में, मेरे स्थानीय लेआउट फ़ाइल में न्यूनतम ऊंचाई 4dp पर सेट करें।
<ProgressBar
android:id="@+id/pb_loading"
style="@style/Widget.ProgressBar.Horizontal"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:indeterminate="true"
android:minHeight="4dp"
android:minWidth="48dp"
android:progressDrawable="@drawable/progress_indeterminate_horizontal_holo" />
<your-sdk-folder>/platforms/android-17/data/res/drawable-hdpi/
मैं क्षैतिज शैली के साथ प्रगतिबार का उपयोग करते समय एक ही समस्या से मिला।
मूल कारण यह है कि प्रगति पट्टी के लिए डिफ़ॉल्ट 9-पैच ड्रॉबल: (प्रगति_बग_होलो_डार्क.9.png) में पैडिंग के रूप में कुछ ऊर्ध्वाधर पारदर्शी पिक्सेल हैं।
अंतिम समाधान जो मेरे लिए काम किया है: प्रगति को ड्रा करने योग्य, मेरे नमूने कोड का पालन करें:
custom_horizontal_progressbar_drawable.xml
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@android:id/background">
<shape android:shape="rectangle">
<solid android:color="#33ffffff" />
</shape>
</item>
<item android:id="@android:id/secondaryProgress">
<clip>
<shape android:shape="rectangle">
<solid android:color="#ff9800" />
</shape>
</clip>
</item>
<item android:id="@android:id/progress">
<clip>
<shape android:shape="rectangle">
<solid android:color="#E91E63" />
</shape>
</clip>
</item>
</layer-list>
लेआउट स्निपेट:
<ProgressBar
android:id="@+id/song_progress_normal"
style="@style/Widget.AppCompat.ProgressBar.Horizontal"
android:layout_width="match_parent"
android:layout_height="5dp"
android:layout_alignParentBottom="true"
android:progressDrawable="@drawable/custom_horizontal_progressbar_drawable"
android:progress="0"/>
एक तरकीब यह है कि अपने प्रगति बार में नकारात्मक मार्जिन जोड़ें।
नीचे XML कोड का एक उदाहरण है, यह मानते हुए कि यह आपकी स्क्रीन के ऊपर है:
<ProgressBar
android:id="@+id/progressBar"
style="@style/Widget.AppCompat.ProgressBar.Horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="-7dp"
android:layout_marginBottom="-7dp"
android:indeterminate="true" />
सुबिन का जवाब केवल एक ही (वर्तमान में) लगता है कि भविष्य में एंड्रॉइड प्रोल्यूसर के रिलीज में टूटने के लिए एक नाजुक हैक विषय नहीं है।
लेकिन संसाधनों को तोड़ने, उन्हें संशोधित करने और अनिश्चित काल तक बनाए रखने की परेशानी से गुजरने के बजाय, मैंने MaterialProgressBar लाइब्रेरी का उपयोग करने का विकल्प चुना है , जो हमारे लिए ऐसा करती है:
<me.zhanghai.android.materialprogressbar.MaterialProgressBar
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:indeterminate="true"
android:layout_gravity="bottom"
custom:mpb_progressStyle="horizontal"
custom:mpb_showTrack="false"
custom:mpb_useIntrinsicPadding="false"
style="@style/Widget.MaterialProgressBar.ProgressBar.Horizontal.NoPadding"
/>
बिल्ड.ग्रेड में:
// Android horizontal ProgressBar doesn't allow removal of top/bottom padding
compile 'me.zhanghai.android.materialprogressbar:library:1.1.6'
उस परियोजना में एक अच्छा डेमो है जो इसके और अंतर्निहित ProgressBar के बीच के अंतर को दर्शाता है।
अगर कोई अभी भी समाधान खोज रहा है - इस टिप्पणी की जाँच करें
न्यूनतम ऊंचाई 4 डीपी निर्धारित करें
android:minHeight="4dp"
-
<ProgressBar
android:id="@+id/web_view_progress_bar"
style="@style/Widget.AppCompat.ProgressBar.Horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:indeterminate="false"
android:max="100"
android:min="0"
android:progress="5"
android:minHeight="4dp"
android:progressTint="@color/vodafone_red"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:progress="60" />
मैं minHeight और maxHeigh का उपयोग करता हूं। यह विभिन्न Api संस्करणों के लिए मदद करता है।
<ProgressBar
android:id="@+id/progress_bar"
style="@style/Base.Widget.AppCompat.ProgressBar.Horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:maxHeight="3dp"
android:minHeight="3dp" />
इसे दोनों का उपयोग करने की आवश्यकता है। Api 23 के साथ अच्छा काम करता है
android:layout_height="wrap_content"
android:minHeight="0dp"
लेकिन कम Api संस्करण उस मामले में प्रगति ऊंचाई को अधिकतम ऊंचाई तक बढ़ाते हैं।
निम्नलिखित आज़माएँ:
<ProgressBar
android:id="@+id/progress_bar"
style="@android:style/Widget.ProgressBar.Horizontal"
android:progress="25"
android:progressTint="@color/colorWhite"
android:progressBackgroundTint="@color/colorPrimaryLight"
android:layout_width="match_parent"
android:layout_height="4dp" />
... और फिर अपनी आवश्यकताओं के लिए प्रगति पट्टी को कॉन्फ़िगर करें क्योंकि यह शुरुआत में एक मध्यम आकार की पट्टी को एक पीले-भूरे रंग की प्रगति पृष्ठभूमि रंग के साथ टिंट के साथ प्रदर्शित करेगी। इसके अलावा, ध्यान दें कि कोई ऊर्ध्वाधर गद्दी नहीं है।
Linearlayout के अंदर इस तरह का प्रयोग करें
<LinearLayout
android:layout_width="match_parent"
android:background="#efefef"
android:layout_height="wrap_content">
<ProgressBar
android:id="@+id/progressBar"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:indeterminate="true"
android:visibility="gone"
android:layout_marginTop="-7dp"
android:layout_marginBottom="-7dp"
style="@style/Widget.AppCompat.ProgressBar.Horizontal"
/>
</LinearLayout>
एंड्रॉइड को जोड़ना: ड्रॉबल में परिभाषित परत-सूची में प्रगति करना मेरे लिए समस्या को निर्धारित करता है। यह कस्टम ड्रॉबल में प्रोजेस बार को मास्क करके काम करता है
उदाहरण कार्यान्वयन https://stackoverflow.com/a/4454450/1145905 पर वर्णित है
मैं उपयोग कर रहा हूं style="@style/Widget.AppCompat.ProgressBar.Horizontal"
और मार्जिन से छुटकारा पाना काफी आसान था। वह शैली है:
<item name="progressDrawable">@drawable/progress_horizontal_material</item>
<item name="indeterminateDrawable">@drawable/progress_indeterminate_horizontal_material</item>
<item name="minHeight">16dip</item>
<item name="maxHeight">16dip</item>
मैं अभी-अभी मिन / अधिकतम ऊँचाई को पार करता हूँ:
<ProgressBar
style="@style/Widget.AppCompat.ProgressBar.Horizontal"
android:layout_width="match_parent"
android:layout_height="2dp"
android:indeterminate="true"
android:minHeight="2dp"
android:maxHeight="2dp" />
किसी भी नए मॉड्यूल को डाउनलोड करने या यहां तक कि अपने प्रगति पट्टी के आसपास एक फ्रेम-आउट लगाने के लिए आवश्यक नहीं है। ये सब सिर्फ हैक हैं। केवल 2 चरण:
जो भी अपने। Xml में
<ProgressBar
android:id="@+id/workoutSessionGlobalProgress"
android:layout_width="match_parent"
android:layout_height="YOUR_HEIGHT"
android:progressDrawable="@drawable/progress_horizontal"
android:progress="0"
<!-- High value to make ValueAnimator smoother -->
android:max="DURATION * 1000"
android:indeterminate="false"
style="@style/Widget.MaterialProgressBar.ProgressBar.Horizontal"/>
प्रगति_होरोसेक्सुअल.एक्सएमएल।, कृपया जैसा चाहें मान बदलें।
गोल कोनों पसंद नहीं है?
कॉर्नर त्रिज्या निकालें
रंग पसंद नहीं है? रंग आदि बदलें!
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@android:id/background">
<shape>
<corners android:radius="5dip" />
<gradient
android:startColor="#ff9d9e9d"
android:centerColor="#ff5a5d5a"
android:centerY="0.75"
android:endColor="#ff747674"
android:angle="270"
/>
</shape>
</item>
<item android:id="@android:id/secondaryProgress">
<clip>
<shape>
<corners android:radius="5dip" />
<gradient
android:startColor="#80ffd300"
android:centerColor="#80ffb600"
android:centerY="0.75"
android:endColor="#a0ffcb00"
android:angle="270"
/>
</shape>
</clip>
</item>
<item android:id="@android:id/progress">
<clip>
<shape>
<corners android:radius="5dip" />
<gradient
android:startColor="#ffffd300"
android:centerColor="#ffffb600"
android:centerY="0.75"
android:endColor="#ffffcb00"
android:angle="270"
/>
</shape>
</clip>
</item>
</layer-list>
आम तौर पर, ये उन चीजों के कोड को बदलने के लिए कदम हैं जिन्हें आप पसंद नहीं करते हैं। बस स्रोत कोड ढूंढें और पता करें कि क्या बदलना है। यदि आप ProgressBar स्रोत कोड का पालन करते हैं, तो आपको एक फ़ाइल मिलेगी, जिसे कहा जाता है progress_horiolet.xml जो इसे संदर्भित करता है। मूल रूप से मैं अपनी सभी XML समस्याओं को कैसे हल करता हूं।
<ProgressBar
android:layout_marginTop="-8dp"
android:layout_marginLeft="-8dp"
android:layout_marginRight="-8dp"
android:id="@+id/progress_bar"
style="?android:attr/progressBarStyleHorizontal"
android:layout_width="match_parent"
android:layout_height="4dp"
android:indeterminate="false"
android:indeterminateTint="@color/white"
android:max="100"
android:paddingStart="8dp"
android:paddingRight="0dp"
android:progressDrawable="@drawable/progress_bg" />
<androidx.core.widget.ContentLoadingProgressBar
android:id="@+id/progressBar"
style="@style/Widget.AppCompat.ProgressBar.Horizontal"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:indeterminate="true"
android:paddingTop="2dp"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toTopOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"/>
बस सामग्री प्रगतिवादी का उपयोग करें जिसमें कोई छिपा हुआ मार्जिन नहीं है।
<com.google.android.material.progressindicator.ProgressIndicator
android:id="@+id/progressBar"
style="@style/Widget.MaterialComponents.ProgressIndicator.Linear.Indeterminate"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:indicatorColor="@color/colorPrimary"
app:trackColor="@color/colorAccent" />
एक सरल नो-ट्रिक्स सॉल्यूशन जो एंड्रॉइड के किसी भी संस्करण के साथ संगत है और बाहरी पुस्तकालयों की आवश्यकता नहीं है ProgressBar
, दो के Views
अंदर फकिंग है LinearLayout
। यह वही है जिसके साथ मैं समाप्त हुआ। बहुत साफ दिखता है और यह दृष्टिकोण काफी लचीला है - आप इसे कायरतापूर्ण तरीकों से चेतन कर सकते हैं, पाठ जोड़ सकते हैं आदि।
लेआउट:
<LinearLayout
android:id="@+id/inventory_progress_layout"
android:layout_width="match_parent"
android:layout_height="4dp"
android:orientation="horizontal">
<TextView
android:id="@+id/inventory_progress_value"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<TextView
android:id="@+id/inventory_progress_remaining"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
कोड:
public void setProgressValue(float percentage) {
TextView progressValue = (TextView) findViewById(R.id.inventory_progress_value);
TextView progressRemaining = (TextView) findViewById(R.id.inventory_progress_remaining);
LinearLayout.LayoutParams paramsValue = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
LinearLayout.LayoutParams paramsRemaining = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
paramsValue.weight = (100 - percentage);
paramsRemaining.weight = percentage;
progressValue.setLayoutParams(paramsValue);
progressRemaining.setLayoutParams(paramsRemaining);
}
परिणाम (कुछ उन्नयन के साथ):
सबसे अच्छा समाधान होना चाहिए
android:minHeight="0dp"
कोई वर्कअराउंड और आकर्षण की तरह काम नहीं करता है।
minHeight
यह 0 से बड़ा है (32dp शायद कहें) पूर्वनिर्धारित। इस संपत्ति को बदलने से आपको एक अलग रूप मिलता है।
maxHeight
, काम नहीं करती है।