UL sms-biljett: Få seekbar att bete sig som iphone-slide? (slide to send)

Diskussion i 'Frågor, support och diskussion' startad av Musenkishi, 9 februari 2010.

  1. Musenkishi

    Musenkishi Youth Droid Medlem

    Blev medlem:
    26 november 2009
    Inlägg:
    100
    Mottagna gillanden:
    16

    MINA ENHETER

    Halloj!
    Har börjat koda lite själv och har kommit till ett stopp.
    Jag håller på med att försöka få en seekbar att bete sig likt en slide i iphone-stil (slide to unlock) men det blir konstiga fel i onTouchEvent-metoden. :(

    Tanken är att jag ska kunna betala en sms-biljett till Upplands Lokaltrafik genom att öppna programmet och skicka iväg ett redan-klart-sms men när jag demonstrerade det för bekanta tidigare idag så råkade jag komma åt knappen alldeles för enkelt. Så jag tänkte att det vore säkrare att "dra iväg" ett sms (slide to send).

    Det som händer är att koden funkar fint när jag drar markören ända till 100 då jag ställt in att seekbar ska inaktiveras tills man släpper taget och sen hoppa till början för att inte skicka flera sms av misstag. Problemet är att jag vill att den ska hoppa tillbaka till början om jag inte är på 100(slutet) men när jag skriver in det i koden så blir det något sorts fel som jag inte kan tolka då jag inte är van med eclipse. Felet uppstår alltså när jag försöker ta tag i markören.
    Hittade den här texten i debuggern så jag antar att det är ett NullPointerException någonstans?
    Jag har iaf fastnat och kan inte förstå problemet. Har testat i Android 1.6 och 2.1 med samma resultat.

    Hjälp någon? :)

    Här är relevanta java-koden:
    Kod:
    package namn.på.paketet;
    
    import alla.nödvändiga.Bibliotek;
    
    public class KlassNamn extends Activity {
    
    SeekBar seekbar;
    MotionEvent motion;
    	
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);	
    
    	seekbar = (SeekBar) findViewById(R.id.SeekBar); //seekbar heter SeekBar i layout.xml   
    	
    	seekbar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
    			
    		@Override
    		public void onStopTrackingTouch(SeekBar seekBar) {
    			// TODO Auto-generated method stub				
    		}
    			
    		@Override
    		public void onStartTrackingTouch(SeekBar seekBar) {
    			// TODO Auto-generated method stub
    		}
    			
    		@Override
    		public void onProgressChanged(SeekBar seekBar, int progress,
    				boolean fromUser) {
    			
    			//Inget annat än if(progress == 100) funkar. 
    			//Har prövat med if(progress < 100) och satt koden i else. Funkar inte.
    			if(progress == 100 && fromUser == true)
    			{
    				//Visar popup och inaktiverar seekbar tills man släpper och flyttar markören till 0.
    				Toast.makeText(getBaseContext(), 
    	                    "Slidern är på 100(max).", 
    	                    Toast.LENGTH_SHORT).show();
    				seekbar.setEnabled(false);
    				seekbar.onTouchEvent(motion);
    			}
    			//Prövade med else och fick samma fel	
    			if(progress > 0 && progress < 100 && fromUser == true)
    			{
    				//seekbar.onTouchEvent(motion); <--Flyttar jag på knappen med denna kod aktiverad så blir det fel.
    			}
    				
    		}
    	});
    }
        
    @Override
    public boolean onTouchEvent(MotionEvent me) {
        int action = me.getAction();
        //int progress = seekbar.getProgress();
        boolean enabled = seekbar.isEnabled();
                
        switch(action){
        case MotionEvent.ACTION_UP:
           	if(!enabled){
           		seekbar.setEnabled(true);
           	}
              	seekbar.setProgress(0);
           	break;
        }
        return true;
    }
    }
     
    Last edited: 14 februari 2010
  2. juanez

    juanez Teen Droid Medlem

    Blev medlem:
    17 december 2009
    Inlägg:
    327
    Mottagna gillanden:
    2

    MINA ENHETER

    seekbar.onTouchEvent(motion);

    där motion är null.

    för övrigt, utan att öht ha pillrat med det, tror jag inte det är en bra ide att du själv kallar på onTouchEvent, utan snarare implementerar en aktuella lyssnaren för dylika event..
     
    Last edited: 9 februari 2010
  3. Musenkishi

    Musenkishi Youth Droid Medlem

    Blev medlem:
    26 november 2009
    Inlägg:
    100
    Mottagna gillanden:
    16

    MINA ENHETER

    Tack, nu funkar det! :)
    tog bort motion-variabeln och allt blev mer logiskt.
    Satte även in seekbar.setProgress(0); i onStopTrackingTouch-metoden så nu funkar den precis som jag ville.
    Nu ska jag bara försöka få thumb att bli större. Ändrade layout height till 25pt men knappen höll sig till normal storlek. Något tips?

    EDIT: Nevermind... var ju bara att sätta en drawable på thumb och sätta thumbOffset på 0pt. :)
     
    Last edited: 9 februari 2010
  4. afzkl

    afzkl Youth Droid Medlem

    Blev medlem:
    27 augusti 2009
    Inlägg:
    184
    Mottagna gillanden:
    6

    MINA ENHETER

    Tänkte bara flika in lite annat smått o gott som är bra och veta om SeekBar:)

    För att ändra bakgrund, färg och allt sådan så kan man ju göra det med följande:
    Kod:
    android:progressDrawable="@drawable/custom_seekbar"
    
    Formatet för denna custom_seekbar är följande:
    HTML:
    <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="#2C88F2"
                            android:centerColor="#194C85"
                            android:centerY="0.75"
                            android:endColor="#2C88F2"
                            android:angle="270"
                    />
                </shape>
            </clip>
        </item>
        
    </layer-list>
    
    
    
    I detta fall blir det en gradiant blå SeekBar. Du kan få den att se ut i stort sett hur du vill. Använde den i min aplikation och den ser ut så här ungefär.
    [​IMG]

    Om du satt en custom thumb på din seekbar nu med hjälp av en vanlig bild så har du säkert märkt att den inte ändras när den får fokus som den gör som standard.
    Formatet för en dynamitask SeekBar thumb är följande:
    HTML:
    <selector xmlns:android="http://schemas.android.com/apk/res/android">
    
        <item android:state_pressed="true"
              android:state_window_focused="true"
              android:drawable="@drawable/seek_thumb_selected" />
    
        <item android:state_focused="true"
              android:state_window_focused="true"
              android:drawable="@drawable/seek_thumb_selected" />
    
        <item android:state_selected="true"
              android:state_window_focused="true"
              android:drawable="@drawable/seek_thumb_selected" />
    
        <item android:drawable="@drawable/seek_thumb_normal" />
    
    </selector>
    
    Alla drawables som specificeras här är då samma thumb fast i två olika toner. Ser lite mer välgjort ut om man gör såhär.

    Alla dessa xml snuttar är drawables så du lägger dem i din drawable mapp.

    Säkert nån som får lite hjälp av det här, spenderade själv timtal innan jag löste det.:P

    Säg gärna till om ytterligare förklaringar behövs.

    mvh afzkl
     
    Last edited: 9 februari 2010
  5. juanez

    juanez Teen Droid Medlem

    Blev medlem:
    17 december 2009
    Inlägg:
    327
    Mottagna gillanden:
    2

    MINA ENHETER

    afzkl; lånade dina färgkoder :) tack o bock
     
  6. Musenkishi

    Musenkishi Youth Droid Medlem

    Blev medlem:
    26 november 2009
    Inlägg:
    100
    Mottagna gillanden:
    16

    MINA ENHETER

    *stolt*:innocent:
    [​IMG][​IMG][​IMG]
    Tack för hjälpen juanez och afzkl!
     
    Last edited: 10 februari 2010
  7. Dirk Diggler

    Dirk Diggler Android Medlem

    Blev medlem:
    12 januari 2010
    Inlägg:
    6.414
    Mottagna gillanden:
    523

    MINA ENHETER

  8. afzkl

    afzkl Youth Droid Medlem

    Blev medlem:
    27 augusti 2009
    Inlägg:
    184
    Mottagna gillanden:
    6

    MINA ENHETER

    Blev ju riktigt fint alltså!;)
     
  9. Musenkishi

    Musenkishi Youth Droid Medlem

    Blev medlem:
    26 november 2009
    Inlägg:
    100
    Mottagna gillanden:
    16

    MINA ENHETER

    Det är möjligt att jag lägger till det men just nu ligger mitt intresse i att göra applikationen så komplett som möjligt för min lokala trafik.
    Jag har planer på att fixa en funktion som kan läsa inkommande sms och ifall ett är en sms-biljett så ska den visas som ett kvitto på skärmen så länge som den är giltig. Problemet blir ju då att jag inte vet hur sms-biljetter ser ut i resten av landet så där ser jag ett problem... ett dyrt problem:ehm:

    Har dock en fråga till alla; ska jag lägga till en bekräftelseruta? Just nu så skickas ett sms direkt knappen når slutet av spåret (man måste släppa för att det ska skicka)... kanske inte den bästa designen men man vill ju att det ska vara enklare än att skriva sms själv. Det är ju grundidén till appen. Åsikter?:)

    EDIT: Kan förresten nämna att det var just en sån app som ligger bakom mitt kodande då det är en bugg i HTC Tattoo som gör att metoden sendTextMessage() skickar två sms istället för ett. Min applikation använder sendMultipartTextMessage() som är kompatibel med Tattoo och säkert alla andra android-telefoner då jag bara hört talas om den här buggen på Tattoo. :)
     
    Last edited: 14 februari 2010
  10. ZilverZurfarn

    ZilverZurfarn Adult Droid Medlem

    Blev medlem:
    10 juni 2009
    Inlägg:
    909
    Mottagna gillanden:
    276
    Telefon:
    Redmi Note 9 Pro

    MINA ENHETER

    Telefon:
    Redmi Note 9 Pro
    Platta:
    Huawei Mediapad T1
    Då jag har gjort SMS-Biljett för Göteborg, kunde jag mycket väl tänka mig att pytsa in "Slide To Send" - Om Musenkishi delar med sig av koden som rör den biten :)

    /Mats
     
    Last edited: 16 februari 2010
  11. Musenkishi

    Musenkishi Youth Droid Medlem

    Blev medlem:
    26 november 2009
    Inlägg:
    100
    Mottagna gillanden:
    16

    MINA ENHETER

    Sisådär en månad senare (ursäkta förseningen o_O) kommer jag tillbaka med svaret: Seekbar var inte optimalt att använda för olika skärmstorlekar plus att jag inte hittade något sätt att hindra thumb från att flytta när man nuddar seekbar utanför thumbens position.
    Jag har istället implementerat kod från Lock 2.0's föregångare slideunlocker, specifikt SlidableButton, och skrivit om koden för att köra RelativeLayout istället för AbsoluteLayout. :)

    Såhär ser min app ut just nu:
    [​IMG]
    Bilderna är tagna från emulatorn med android 1.6. Jag har testat med min Tattoo och programmet fungerar utmärkt. :innocent:
    Jag borde seriöst fundera på att byta namn på applikationen...
     
  12. BearArms

    BearArms Infant Droid Medlem

    Blev medlem:
    22 juli 2010
    Inlägg:
    1
    Mottagna gillanden:
    0

    MINA ENHETER

    Sorry för necropost men jag bara undrar, hur gjorde du för att få det att fungera med RelativeLayout? Sitter själv med ett liknande problem med en iPhone-liknande slider fast jag använder LinearLayout istället för Relative, och har totalt kört fast. Om jag inte hittar nån annan lösning kan jag byta till RelativeLayout, men vill helst behålla den Linjära Layouten.

    MVH,
    BearArms