私はシークバーの親指用にドロウアブルを使用しています
Android:thumb="@drawable/thumb"
このつまみのサイズをdip unitで設定するにはどうすればよいですか?シークバーに次のようなスタイルを使用しているため
<style name="CustomSeekBar">
<item name="Android:indeterminateOnly">false</item>
<item name="Android:minHeight">8dip</item>
<item name="Android:maxHeight">8dip</item>
<item name="Android:thumbOffset">8dip</item>
</style>
そして、12dip
高さと幅。
親指のサイズを設定する最も柔軟な方法は、図形をプレースホルダーとして階層化された描画可能を作成することですthumb_image.xml
:
<layer-list xmlns:Android="http://schemas.Android.com/apk/res/Android" >
<item>
<shape>
<size
Android:height="40dp"
Android:width="40dp" />
<solid Android:color="@Android:color/transparent" />
</shape>
</item>
<item Android:drawable="@drawable/scrubber_control_normal_holo"/>
</layer-list>
したがって、基本的に形状のサイズを変更すると、ドロアブルが引き伸ばされ、形状は透明になり、見えなくなります。また、そのようなつまみの最小サイズはビットマップのサイズです。
レイアウトの例を次に示します。
<SeekBar
Android:id="@+id/seekBar1"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:thumb="@drawable/thumb_image" />
<SeekBar
Android:id="@+id/seekBar2"
Android:layout_width="match_parent"
Android:layout_height="wrap_content" />
同様のことを行う方法も探していましたが、他の質問を見てすべての答えをまとめた後、onCreate()でSeekbarのサムのサイズを変更する方法を思いつきました。
onCreate()
からの私のコードは、あなたのニーズに少し適合しています。
ViewTreeObserver vto = mySeekBar.getViewTreeObserver();
vto.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
public boolean onPreDraw() {
Resources res = getResources();
Drawable thumb = res.getDrawable(R.drawable.thumb);
int h = mySeekBar.getMeasuredHeight() * 1.5; // 8 * 1.5 = 12
int w = h;
Bitmap bmpOrg = ((BitmapDrawable)thumb).getBitmap();
Bitmap bmpScaled = Bitmap.createScaledBitmap(bmpOrg, w, h, true);
Drawable newThumb = new BitmapDrawable(res, bmpScaled);
newThumb.setBounds(0, 0, newThumb.getIntrinsicWidth(), newThumb.getIntrinsicHeight());
mySeekBar.setThumb(newThumb);
mySeekBar.getViewTreeObserver().removeOnPreDrawListener(this);
return true;
}
});
これは親指のサイズを変更するために機能しますが、含まれているシークバーよりも大きいため、クリップされる可能性があります(それについてはわかりません)。クリップされる場合、より高いシークバーを作成し、ディスプレイに必要なサイズに一致する独自のシークバーの背景を作成する必要があります。
お役に立てれば!
SDKから、これが基本的なSeekBarのスタイルであることがわかります。
<style name="Widget.SeekBar">
<item name="Android:indeterminateOnly">false</item>
<item name="Android:progressDrawable">@Android:drawable/progress_horizontal</item>
<item name="Android:indeterminateDrawable">@Android:drawable/progress_horizontal</item>
<item name="Android:minHeight">20dip</item>
<item name="Android:maxHeight">20dip</item>
<item name="Android:thumb">@Android:drawable/seek_thumb</item>
<item name="Android:thumbOffset">8dip</item>
<item name="Android:focusable">true</item>
</style>
これをサムセレクターとして:
<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_pressed" />
<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>
これらをベースとして使用して、現在使用されているドロアブルを置き換えることができるはずです(これは、あなたが持っているステージのように見えます)。
これらのドロウアブルは、ドロウアブルフォルダーサイズバケット(drawable-hdpi
、drawable-large-hdpi
etc)または、異なるSeekBar
sに異なるスタイル/描画可能サイズを表示させることができます。
<style name="SeekBar.Thumb.Smiley" parent="@Android:style/Widget.SeekBar">
<item name="Android:thumb">@drawable/smiley</item>
<style>
<style name="SeekBar.Thumb.Smiley.Large" parent="@Android:style/Widget.SeekBar">
<item name="Android:thumb">@drawable/smiley_large</item>
<style>
<SeekBar
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
style="@style/SeekBar.Thumb.Smiley.Large"/>
私のために働いた別の簡単な解決策は、scaleX
とscaleY
を使用することでした。親指だけでなく、シークバー全体がこのように大きくなります。
<SeekBar
Android:id="@+id/seekBar1"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:scaleX="2"
Android:scaleY="2" />
私はこのように働いています:
public class FlexibleThumbSeekbar extends SeekBar{
public FlexibleThumbSeekbar (Context context) {
super(context);
}
public FlexibleThumbSeekbar (Context context, AttributeSet attrs) {
super(context, attrs);
Bitmap bitmap=BitmapFactory.decodeResource(getResources(), R.drawable.thumb);
Bitmap thumb=Bitmap.createBitmap(50,50, Bitmap.Config.ARGB_8888);
Canvas canvas=new Canvas(thumb);
canvas.drawBitmap(bitmap,new Rect(0,0,bitmap.getWidth(),bitmap.getHeight()),
new Rect(0,0,thumb.getWidth(),thumb.getHeight()),null);
Drawable drawable = new BitmapDrawable(getResources(),thumb);
setThumb(drawable);
}
}
実際の使用法では、サンプルのみを使用して、幅、高さ、親指の写真をxmlファイルで定義する必要があります。
この方法で問題を解決しました
まず、ソース converter でイメージ/カスタムサム/ビットマップ/その他をSVGファイルに変換しました
次に、SVGファイルをソースによって描画可能なベクターに変換しました SVGからベクター
次に、.xmlファイルでベクターコードを使用しました。ベクタータグには、Android:width="28dp"
とAndroid:height="28dp"
のattrsがあります。ここで、親指のサイズを変更できます。
最後に、seekBarタグのAndroid:thumb="@drawable/thumb.xml"
でthumb.xmlを使用しました
これは私のthumb.xmlです
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:viewportWidth="56"
Android:viewportHeight="56"
Android:width="28dp"
Android:height="28dp">
<group
Android:scaleX="2.0"
Android:scaleY="-2.0"
Android:translateY="56">
<path
Android:pathData="M28 14A14 14 0 0 1 14 28 14 14 0 0 1 0 14 14 14 0 0 1 14 0 14 14 0 0 1 28 14Z"
Android:fillColor="#6b6b6b"
Android:fillAlpha="0.205" />
</group>
<group
Android:scaleX="0.1"
Android:scaleY="-0.1"
Android:translateY="56">
<path
Android:pathData="M135 376C83 353 40 311 40 281c0 -22 13 -34 85 -80 85 -54 115 -59 115 -22 0 22 -59 77 -98 92 -26 10 -26 11 36 50 72 46 81 69 25 69 -21 -1 -51 -7 -68 -14z"
Android:fillColor="#000000" />
<path
Android:pathData="M320 366c0 -26 55 -81 98 -97l26 -10 -44 -26c-88 -51 -106 -83 -46 -83 72 0 179 81 163 124 -8 20 -156 116 -179 116 -12 0 -18 -8 -18 -24z"
Android:fillColor="#000000" />
</group>
</vector>
必要に応じて、高さと幅を持つ長方形の形状を作成します。この形状を親指のドローアブルとして使用します。