2016-10-28 2 views
0

こんにちは私はすべてのアプリアイコンの背後に円の背景を持つアンドロイドランチャーに取り組んでいます。私は、アプリのアイコンは、ここを参照してくださいその後、しかし、円の画像が小さくなって、この作業を取得するためにLayerDrawableを使用しています:LayerDrawableで1つの画像のサイズを変更するには

enter image description here

だから私の質問は、私はアプリのアイコンより丸いアイコンを大きく作るのですかですか?

HERESに私の丸いアイコンコード:

<?xml version="1.0" encoding="utf-8"?> 
<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item> 
     <shape android:shape="oval"> 
      <stroke android:color="#ccc" android:width="5dp" /> 
      <solid android:color="#ffffff"/> 
      <size android:width="58dp" android:height="58dp"/> 
     </shape> 
    </item> 
</selector> 

とHERESにアプリのアイコンを生成します私のクラス:

package Appname.widget; 

import android.content.ClipData; 
import android.content.Context; 
import android.content.Intent; 
import android.graphics.Canvas; 
import android.graphics.Color; 
import android.graphics.Paint; 
import android.graphics.Rect; 
import android.graphics.drawable.Drawable; 
import android.graphics.drawable.LayerDrawable; 
import android.support.annotation.ColorInt; 
import android.support.annotation.Nullable; 
import android.util.AttributeSet; 
import android.view.Gravity; 
import android.view.HapticFeedbackConstants; 
import android.view.View; 
import android.widget.ImageView; 

import appame.R; 
import appname.AppManager; 
import appname.util.DragAction; 
import appname.util.GoodDragShadowBuilder; 
import appname.util.LauncherSettings; 
import appname.util.Tool; 


public class AppItemView extends View implements Drawable.Callback{ 


    public Drawable getIcon() { 


     return icon; 
    } 



    public void setIcon(Drawable icon) { 
     this.icon = icon; 
     this.icon.setCallback(this); 





    } 



    @Override 
    public void refreshDrawableState() { 
     invalidateDrawable(icon); 
     super.refreshDrawableState(); 
    } 

    @Override 
    public void invalidateDrawable(Drawable drawable) { 
     invalidate(); 
    } 

    public String getLabel() { 
     return label; 
    } 

    public void setLabel(String label) { 
     this.label = label; 
    } 

    public float getIconSize() { 
     return iconSize; 
    } 

    public void setIconSize(float iconSize) { 
     this.iconSize = iconSize; 
    } 

    private float iconSize; 

    private Drawable icon; 
    private String label; 

    public boolean isShortcut; 

    public Paint textPaint = new Paint(Paint.ANTI_ALIAS_FLAG); 
    private Rect mTextBound = new Rect(); 

    private boolean noLabel,vibrateWhenLongPress; 

    private float labelHeight; 



    public AppItemView(Context context) { 
     super(context); 

     init(); 
    } 

    public AppItemView(Context context, AttributeSet attrs) { 
     super(context, attrs); 

     init(); 
    } 



    private void init(){ 
     setWillNotDraw(false); 

     labelHeight = Tool.convertDpToPixel(14,getContext()); 

     textPaint.setTextSize(sp2px(getContext(),14)); 
     textPaint.setColor(Color.DKGRAY); 
    } 

    public static int sp2px(Context context, float spValue) { 
     final float fontScale = context.getResources().getDisplayMetrics().scaledDensity; 
     return (int) (spValue * fontScale + 0.5f); 
    } 

    @Override 
    protected void onLayout(boolean changed, int left, int top, int right, int bottom) { 
     super.onLayout(changed, left, top, right, bottom); 
    } 

    @Override 
    protected void onDraw(Canvas canvas) { 



     Drawable iconback = getResources().getDrawable(R.drawable.iconback); 
     LayerDrawable appicon = new LayerDrawable(new Drawable[]{iconback, icon}); 
     appicon.setLayerGravity(0, Gravity.CENTER); 
     appicon.setLayerGravity(1, Gravity.CENTER); 

     if (label != null && !noLabel){ 
      textPaint.getTextBounds(label,0,label.length(),mTextBound); 
     } 

     //The height should be the same as they have the same text size. 
     float mHeight = iconSize + (noLabel? 0 : labelHeight); 
     float heightPadding = (getHeight() - mHeight)/2f; 

     if (label != null && !noLabel) { 
      float x = (getWidth()-mTextBound.width())/2f; 
      if (x < 0) 
       x = 0; 
      canvas.drawText(label,x, getHeight() - heightPadding, textPaint); 
     } 




     if (appicon != null) { 
      canvas.save(); 
      canvas.translate((getWidth()-iconSize)/2,heightPadding); 
      appicon.setLayerWidth(1, (int) iconSize); 
      appicon.setLayerHeight(1, (int) iconSize); 
      appicon.setBounds(0,0,(int)iconSize,(int)iconSize); 
      appicon.draw(canvas); 
      canvas.restore(); 
     } 
    } 



    public static class Builder{ 
     AppItemView view; 

     public Builder(Context context){ 
      view = new AppItemView(context); 


      float iconSize = Tool.convertDpToPixel(LauncherSettings.getInstance(view.getContext()).generalSettings.iconSize, view.getContext()); 
      view.setIconSize(iconSize); 


     } 

     public AppItemView getView(){ 
      return view; 

     } 


     public Builder setAppItem(AppManager.App app){ 
      view.setIcon(app.icon); 
      view.setLabel(app.appName); 



      return this; 
     } 

     public Builder withOnClickLaunchApp(final AppManager.App app){ 
      view.setOnClickListener(new OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        Tool.createScaleInScaleOutAnim(view, new Runnable() { 
         @Override 
         public void run() { 
          Tool.startApp(view.getContext(), app); 
         } 
        }); 
       } 
      }); 
      return this; 
     } 

     public Builder withOnLongClickDrag(final AppManager.App app,final DragAction.Action action,@Nullable final OnLongClickListener eventAction){ 
      withOnLongClickDrag(Desktop.Item.newAppItem(app),action,eventAction); 
      view.setScaleX(0.75f); // <- resized by scaling 
      view.setScaleY(0.75f); 
      return this; 
     } 

     public Builder withOnLongClickDrag(final Desktop.Item item, final DragAction.Action action, @Nullable final OnLongClickListener eventAction){ 

      view.setOnLongClickListener(new OnLongClickListener() { 
       @Override 
       public boolean onLongClick(View v) { 
        if (view.vibrateWhenLongPress) 
         v.performHapticFeedback(HapticFeedbackConstants.LONG_PRESS); 
        Intent i = new Intent(); 
        i.putExtra("mDragData", item); 
        ClipData data = ClipData.newIntent("mDragIntent", i); 
        v.startDrag(data, new GoodDragShadowBuilder(v), new DragAction(action), 0); 
        if (eventAction != null) 
         eventAction.onLongClick(v); 
        return true; 

       } 
      }); 
      return this; 
     } 

     public Builder withOnTouchGetPosition(){ 
      view.setOnTouchListener(Tool.getItemOnTouchListener()); 
      return this; 
     } 

     public Builder setTextColor(@ColorInt int color){ 
      view.textPaint.setColor(color); 
      return this; 
     } 

     public Builder setNoLabel(){ 
      view.noLabel = true; 
      return this; 
     } 

     public Builder vibrateWhenLongPress(){ 
      view.vibrateWhenLongPress = true; 
      return this; 
     } 

     public Builder setShortcutItem(final Intent intent){ 
      view.isShortcut = true; 
      view.setScaleX(0.75f); // <- resized by scaling 
      view.setScaleY(0.75f); 
      view.setOnClickListener(new OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        Tool.createScaleInScaleOutAnim(view, new Runnable() { 
         @Override 
         public void run() { 
          view.getContext().startActivity(intent); 



         } 
        }); 
       } 
      }); 
      view.setScaleX(0.75f); // <- resized by scaling 
      view.setScaleY(0.75f); 
      view.setIcon(Tool.getIconFromID(view.getContext(),intent.getStringExtra("shortCutIconID"))); 
      view.setLabel(intent.getStringExtra("shortCutName")); 
      return this; 

     } 
    } 


} 

アイコンはJAVAませXMLで生成されていますのでご注意ください!

何か助けが素晴らしいだろう!

事前に感謝:)

答えて

1

LayerDrawableを作成する前に、あなたがそうのようなInsetDrawable内のアイコンをラップすることができに:

Drawable iconWithPadding = new InsetDrawable(icon, paddingSize); 
LayerDrawable appicon = new LayerDrawable(new Drawable[]{iconback, iconWithPadding}); 

効果的アイコンにパディングを適用します。

+0

これは本当にありがとうございました!!!!! – Phoneswapshop

関連する問題