2009-03-10 19 views
17

संचालित करने के लिए संशोधित करना मैं एमुलेटर के साथ एक लंबवत खोजबार प्राप्त करने की कोशिश कर रहा हूं, लेकिन मैं अटक गया हूं। मैं चाहने के लिए खोजबार प्राप्त कर सकता हूं, जिस तरह से मैं इसे चाहता हूं, और मैं जो भी चाहता हूं उसे करने के लिए प्रगति प्राप्त कर सकता हूं, और मैं पर टचवेन्ट को क्षैतिज रूप से लंबवत जाने के लिए संशोधित कर सकता हूं। मैं क्या नहीं कर सकता 0gडिफ़ॉल्ट 29 क्षैतिज पिक्सल के बाहर setThumbOffset() का उपयोग किए बिना अंगूठे को प्राप्त करने के लिए अंगूठे प्राप्त करें। में यह कोई समस्या नहीं है। समस्या इस तथ्य से आ रही है कि मैं अंगूठे ऑफसेट को बिल्कुल समझ नहीं पा रहा हूं - मुझे लगता है। मुझे लगता है कि मैं विजेट का आकार बदल सकता हूं, जो मुझे पूरा यकीन है कि मैं सही नहीं कर रहा हूं। या शायद मैं थंब ऑफसेट का उपयोग कर सकता हूं अगर मैं इसे समझ सकता हूं। चूंकि मैं प्रगति की सही ढंग से गणना कर सकता हूं, मैंने सोचा था कि मैं विजेट के प्रगति * (getTop() - getBottom()) के एक रैखिक फ़ंक्शन का उपयोग करूंगा लेकिन ऐसा प्रतीत नहीं होता है। लेकिन मैं यह नहीं समझ सकता कि ऑफसेट केंद्रित है।एंड्रॉइड लुकबार विजेट को लंबवत

कुछ हद तक एक तरफ, मैं वास्तव में अनिश्चित हूं कि पर मैं क्या कर रहा हूं SizeChanged() sane है या अगर यह मुझे बाद में पर गधे में काटने जा रहा है।

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" > 

    <com.mobilsemantic.mobipoll.SlideBar 
     android:id="@+id/slide" 
     android:layout_width="wrap_content" 
     android:layout_height="fill_parent" 
     android:max="100" 
     android:progress="0" 
     android:secondaryProgress="25" /> 

     <Button android:id="@+id/button" 
      android:layout_width="fill_parent" 
      android:layout_height="fill_parent" 
      android:text="Hello, I am a Button" /> 

    <TextView android:id="@+id/tracking" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" /> 

</LinearLayout> 

और वर्ग (डिबगिंग कबाड़ ध्यान न दें):

import android.content.Context; 
import android.graphics.Canvas; 
import android.util.AttributeSet; 
import android.util.Log; 
import android.view.MotionEvent; 
import android.view.View; 
import android.widget.SeekBar; 

public class SlideBar extends SeekBar { 

     private int oHeight = 320, oWidth = 29; 
     private int oProgress = -1, oOffset = -1;; 
     private float xPos = -1, yPos = -1; 
     private int top = -1, bottom = -1, left = -1, right = -1; 

     public SlideBar(Context context) { 
       super(context); 
     } 
     public SlideBar(Context context, AttributeSet attrs) 
     { 
       super(context, attrs); 
       oOffset = this.getThumbOffset(); 
       oProgress = this.getProgress(); 
     } 
     public SlideBar(Context context, AttributeSet attrs, int defStyle) 
     { 
       super(context, attrs, defStyle); 
     } 

     protected synchronized void onMeasure(int widthMeasureSpec, intheightMeasureSpec) 
     { 
       int height = View.MeasureSpec.getSize(heightMeasureSpec); 
       oHeight = height; 
       this.setMeasuredDimension(oWidth, oHeight); 

     } 
     protected void onSizeChanged(int w, int h, int oldw, int oldh) 
     { 
       super.onSizeChanged(h, w, oldw, oldh); 
     } 
     protected void onLayout(boolean changed, int l, int t, int r, int b) 
     { 
       super.onLayout(changed, l, t, r, b); 
       left = l; 
       right = r; 
       top = t; 
       bottom = b; 
     } 
     protected void onDraw(Canvas c) 
     { 
       c.rotate(90); 
       c.translate(0,-29); 
       super.onDraw(c); 
     } 
     public boolean onTouchEvent(MotionEvent event) 
     { 
       xPos = event.getX(); 
       yPos = event.getY(); 
       float progress = (yPos-this.getTop())/(this.getBottom()-this.getTop()); 
       oOffset = this.getThumbOffset(); 
       oProgress = this.getProgress(); 
       Log.d("offset" + System.nanoTime(), new Integer(oOffset).toString()); 
       Log.d("progress" + System.nanoTime(), new Integer(oProgress).toString()); 

       float offset; 

       offset = progress * (this.getBottom()-this.getTop()); 

       this.setThumbOffset((int)offset); 

       Log.d("offset_postsetprogress" + System.nanoTime(), new Integer(oOffset).toString()); 
       Log.d("progress_postsetprogress" + System.nanoTime(), new Integer(oProgress).toString()); 

       this.setProgress((int)(100*event.getY()/this.getBottom())); 
       return true; 
     } 

} 
+0

देखना होगा http://stackoverflow.com/a/28397583/3496570 और http://stackoverflow.com/a/28397530/ 34 9 6570 – Nepster

उत्तर

9

API 11 and later के लिए, seekbar's XML गुण (android:rotation="270") लंबवत प्रभाव के लिए उपयोग कर सकते हैं।

<SeekBar 
android:id="@+id/seekBar1" 
android:layout_width="match_parent" 
android:layout_height="wrap_content" 
android:rotation="270"/> 

पुराने एपीआई स्तर (पूर्व API10), उपयोग के लिए: https://github.com/AndroSelva/Vertical-SeekBar-Android या देखते हैं कि यह sample here

आप भी इसे अपडेट करना पड़ता है ऊंचाई & चौड़ाई के रूप में इफ्तिखार द्वारा

का सुझाव क्रम में

seekBar.setLayoutParams(
       new ViewGroup.LayoutParams(convertDpToPixels(1.0f,mContext), ViewGroup.LayoutParams.WRAP_CONTENT)); 

// परीक्षण नहीं किया ..

जहां

public static int convertDpToPixels(float dp, Context context){ 
    Resources resources = context.getResources(); 
    return (int) TypedValue.applyDimension(
      TypedValue.COMPLEX_UNIT_DIP, 
      dp, 
      resources.getDisplayMetrics() 
    ); 
} 
+0

में "setOnSeekBarChangeListener" का उपयोग नहीं करते हैं, इस तरह आप रोटेशन के बाद चाहें ऊंचाई और चौड़ाई बदल सकते हैं। –

2

android source पर एक नजर डालें

यहाँ main.xml लेआउट है। मुझे लगता है कि आपको कम से कम ट्रैक टचवेन्ट को बदलने की ज़रूरत है और वहां कुछ अन्य जगहें हो सकती हैं जहां आपको नियंत्रण के घूर्णन को ध्यान में रखने के लिए एक्स, वाई निर्देशांक को स्वैप करने की भी आवश्यकता है।

0

मदद कर सकते हैं कर सकते हैं, यह एक फ्रेम लेआउट में डाल दिया, तो जावा में लेआउट 90 अंश घुमाने? लगता है ...

17

मैंने एक समाधान बनाया है जो (कम से कम मेरे लिए, वैसे भी) बनाता है और एक लंबवत SeekBar बनाता है। http://hackskrieg.wordpress.com/2012/04/20/working-vertical-seekbar-for-android/

इस कोड को सही ढंग से चयन करेंगे/अंगूठे का चयन रद्द, सही ढंग से ले जाते हैं, सही ढंग से श्रोता को अद्यतन (केवल जब प्रगति परिवर्तन!), अद्यतन /, सही ढंग से प्रगति आकर्षित आदि मुझे आशा है कि यह आप में मदद करता है।

public class VerticalSeekBar extends SeekBar { 

public VerticalSeekBar(Context context) { 
    super(context); 
} 

public VerticalSeekBar(Context context, AttributeSet attrs, int defStyle) { 
    super(context, attrs, defStyle); 
} 

public VerticalSeekBar(Context context, AttributeSet attrs) { 
    super(context, attrs); 
} 

protected void onSizeChanged(int w, int h, int oldw, int oldh) { 
    super.onSizeChanged(h, w, oldh, oldw); 
} 

@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); 
} 

private OnSeekBarChangeListener onChangeListener; 
@Override 
public void setOnSeekBarChangeListener(OnSeekBarChangeListener onChangeListener){ 
    this.onChangeListener = onChangeListener; 
} 

private int lastProgress = 0; 
@Override 
public boolean onTouchEvent(MotionEvent event) { 
    if (!isEnabled()) { 
     return false; 
    } 

    switch (event.getAction()) { 
    case MotionEvent.ACTION_DOWN: 
     onChangeListener.onStartTrackingTouch(this); 
     setPressed(true); 
     setSelected(true); 
     break; 
    case MotionEvent.ACTION_MOVE: 
     // Calling the super seems to help fix drawing problems 
     super.onTouchEvent(event); 
     int progress = getMax() - (int) (getMax() * event.getY()/getHeight()); 

     // Ensure progress stays within boundaries of the seekbar 
     if(progress < 0) {progress = 0;} 
     if(progress > getMax()) {progress = getMax();} 

     // Draw progress 
     setProgress(progress); 

     // Only enact listener if the progress has actually changed 
     // Otherwise the listener gets called ~5 times per change 
     if(progress != lastProgress) { 
      lastProgress = progress; 
      onChangeListener.onProgressChanged(this, progress, true); 
     } 

     onSizeChanged(getWidth(), getHeight() , 0, 0); 
     onChangeListener.onProgressChanged(this, getMax() - (int) (getMax() * event.getY()/getHeight()), true); 
     setPressed(true); 
     setSelected(true); 
     break; 
    case MotionEvent.ACTION_UP: 
     onChangeListener.onStopTrackingTouch(this); 
     setPressed(false); 
     setSelected(false); 
     break; 
    case MotionEvent.ACTION_CANCEL: 
     super.onTouchEvent(event); 
     setPressed(false); 
     setSelected(false); 
     break; 
    } 
    return true; 
} 

public synchronized void setProgressAndThumb(int progress) { 
    setProgress(getMax() - (getMax()- progress)); 
    onSizeChanged(getWidth(), getHeight() , 0, 0); 
} 

public synchronized void setMaximum(int maximum) { 
    setMax(maximum); 
} 

public synchronized int getMaximum() { 
    return getMax(); 
} 
} 

मैं सिर्फ FILL_PARENT को layout_height सेट के साथ एक LinearLayout अंदर इस ऊर्ध्वाधर seekbar रखा जाता है और WRAP_CONTENT करने के लिए सेट layout_width।

<LinearLayout 
    android:layout_width="wrap_content" 
    android:layout_height="fill_parent" 
    android:orientation="vertical" > 

    <com.safetyculture.jsadroidtablet.VerticalSeekBar 
     android:id="@+id/calculatorVerticalSeekBar" 
     android:layout_width="wrap_content" 
     android:layout_height="fill_parent" 
     android:layout_gravity="bottom" 
     android:max="4" 
     android:progress="2" /> 

</LinearLayout> 

नोट: आप एक OnSeekBarChangeListener सेट करना होगा अन्यथा seekbar के साथ बातचीत NullPointerException का उत्पादन करेगा।

+0

@Technlx, ​​क्या आप होम स्क्रीन पर विजेट के लिए इस समाधान का उपयोग करते हैं? – rxlky

+0

यह आपको तब तक त्रुटि देगा जब तक आप अपने संबंधित जावा गतिविधि या कक्षा –

संबंधित मुद्दे