From 82f499aad1236eef14d06757991237764d8d25f9 Mon Sep 17 00:00:00 2001 From: Steve Slaven Date: Mon, 27 Dec 2010 14:06:24 -0800 Subject: Allow specifying tiling modes in the theme config, allow overriding the button container view with some kind of wrapper view and specifying the actual view group to add buttons to diff --git a/src/net/hoopajoo/android/SoftKeys/Generator.java b/src/net/hoopajoo/android/SoftKeys/Generator.java index 42bd57e..3e17c25 100644 --- a/src/net/hoopajoo/android/SoftKeys/Generator.java +++ b/src/net/hoopajoo/android/SoftKeys/Generator.java @@ -24,7 +24,9 @@ import android.content.res.Resources; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Matrix; +import android.graphics.Shader; import android.graphics.Bitmap.Config; +import android.graphics.Shader.TileMode; import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; import android.preference.PreferenceManager; @@ -68,8 +70,31 @@ public class Generator { if( theme.getBoolean( new String[] { prefix + "_resize_background", "resize_background" } ) ) { d = resizeImage( d, iconSize, iconSize ); } + + applyTiling( d, theme.getString( new String[] { + prefix + "_tile_background", + "tile_background" + } ) ); + container.setBackgroundDrawable( d ); } + + // If they have specified a view id to use for insertion then switch to that now + ViewGroup button_container = container; + String button_container_name = theme.getString( new String[] { + prefix + "_button_container_id", + "button_container_id" + } ); + if( button_container_name != null ) { + button_container = (ViewGroup)container.findViewById( theme.getId( + new String[] { button_container_name } ) ); + + // if it's null just go back to main container + if( button_container == null ) { + button_container = container; + } + } + // now we add the buttons if( buttons == null ) { @@ -112,7 +137,7 @@ public class Generator { ImageButton b = (ImageButton)theme.inflateLayout( c, new String[] { prefix + "_button_" + name, prefix + "_button", "button_" + name, "button" } - , container, false ); + , button_container, false ); b.setId( i ); // Add our images at the size we want @@ -142,10 +167,17 @@ public class Generator { d = resizeImage( d, iconSize, iconSize ); } + applyTiling( d, theme.getString( new String[] { + prefix + "_tile_button_background_" + name, + prefix + "_tile_button_background", + "tile_button_background_" + name, + "tile_button_background" + } ) ); + b.setBackgroundDrawable( d ); } - container.addView( b ); + button_container.addView( b ); } // add to root @@ -189,6 +221,47 @@ public class Generator { ret.setTileModeXY( ( (BitmapDrawable)d ).getTileModeX(), ( (BitmapDrawable)d ).getTileModeY() ); } return ret; - } + } + + + /// NOTE: using any tile mode CLAMP seems to crash the emulator + // looking around online some people are saying it crashes their stuff + // too, don't know who's to blame but it seems like avoiding + // clamp is a good idea if you want compatibility + // tiling is specified as mode,mode for x/y tiling, or just mode to + // specify both x and y tiling + private static void applyTiling( Drawable d, String tilemode ) { + // check if they specify tiling, this will override tiling in an xml bitmap + // it's mostly here in case they want just one dimension of tiling instead of both + if( d instanceof BitmapDrawable ) { + BitmapDrawable bm = (BitmapDrawable)d; + // according to docs -1 is the disabled mode but doesn't exist as a constant + // so I'm hoping that setting it null acheives the same effect + Shader.TileMode[] tms = new Shader.TileMode[] { null, null }; + + if( tilemode != null ) { + String[] modes = new String[] { tilemode, tilemode }; + if( tilemode.contains( "," ) ) { + modes = tilemode.split( "," ); + } + + for( int i = 0; i < 2; i++ ) { + String check = modes[ i ]; + if( check.equals( "clamp" ) ) { + tms[ i ] = TileMode.CLAMP; + }else if( check.equals( "repeat" ) ) { + tms[ i ] = TileMode.REPEAT; + }else if( check.equals( "mirror" ) ) { + tms[ i ] = TileMode.MIRROR; + }else{ + // clear tiling, e.g. disabled + tms[ i ] = null; + } + } + } + + bm.setTileModeXY( tms[ 0 ], tms[ 1 ] ); + } + } } \ No newline at end of file diff --git a/src/net/hoopajoo/android/SoftKeys/Theme.java b/src/net/hoopajoo/android/SoftKeys/Theme.java index 310fd31..3fcb880 100644 --- a/src/net/hoopajoo/android/SoftKeys/Theme.java +++ b/src/net/hoopajoo/android/SoftKeys/Theme.java @@ -137,6 +137,16 @@ public class Theme { } */ + // this returns the first ID matched, for use by the generator to find the + // button container view by id + public int getId( String[] name ) { + IdPack i = getId( name, "id" ); + if( i != null ) { + return i.id; + } + return( 0 ); + } + private IdPack getId( String[] name, String type ) { // return the most specific match, from theme first then from app for( IdPack check : mResources ) { -- cgit v0.10.2