প্রোগ্রামযোগ্যভাবে অঙ্কনযোগ্য আকার সেট করুন


90

চিত্রগুলি (আইকনগুলি) প্রায় একই আকারে আসে তবে বোতামগুলির একই উচ্চতা অব্যাহত রাখতে আমার সেগুলি আকার পরিবর্তন করতে হবে।

আমি এটা কিভাবে করবো?

Button button = new Button(this);
button.setText(apiEventObject.getTitle());
button.setOnClickListener(listener);

/*
 * set clickable id of button to actual event id
 */
int id = Integer.parseInt(apiEventObject.getId());
button.setId(id);

button.setLayoutParams(new LayoutParams(
        android.view.ViewGroup.LayoutParams.FILL_PARENT,
        android.view.ViewGroup.LayoutParams.WRAP_CONTENT));

Drawable drawable = LoadImageFromWebOperations(apiSizeObject.getSmall());
//?resize drawable here? drawable.setBounds(50, 50, 50, 50);
button.setCompoundDrawablesWithIntrinsicBounds(drawable, null, null, null);

আপনি কীভাবে অঙ্কনযোগ্য (বিটম্যাপ) আকার পরিবর্তন করতে পারেন?
জেলিমির

4
দেরিতে, তবে ভাবছেন কেন আপনি ফোন দিচ্ছেন না setCompoundDrawables()? অন্তর্নিহিত অ্যান্ড্রয়েড, যেমন মধ্যে অন্যান্য স্থানে মূল ছবির আকার বোঝায় Drawable.getIntrinsicHeight()
উইলিয়াম টি। ম্যালার্ড

উত্তর:


159

setBounds()পদ্ধতি ধারক প্রতি টাইপ জন্য কাজ করে না (আমার কিছু কাজ করেনি ImageView'র অবশ্য)।

নিজেই অঙ্কনযোগ্যকে স্কেল করতে নীচের পদ্ধতিটি ব্যবহার করে দেখুন:

// Read your drawable from somewhere
Drawable dr = getResources().getDrawable(R.drawable.somedrawable);
Bitmap bitmap = ((BitmapDrawable) dr).getBitmap();
// Scale it to 50 x 50
Drawable d = new BitmapDrawable(getResources(), Bitmap.createScaledBitmap(bitmap, 50, 50, true));
// Set your new, scaled drawable "d"

আমার এখানে সমস্যাটি হ'ল এটি এটি আঁকতে সক্ষম চিত্রটির চারপাশে একটি সাদা আয়তক্ষেত্র আঁকে
নোলম্যান

8
বিটম্যাপড্রেএবল (বিটম্যাপ) কনস্ট্রাক্টর অবহেলিত। ব্যবহার করুন: অঙ্কনযোগ্য ডি = নতুন বিটম্যাপড্রেবল (গেটআরসোর্স (), বিটম্যাপ.ক্রিয়েটস্কেলবিটম্যাপ (বিটম্যাপ, 50, 50, সত্য));
অ্যান্ডি

4
এটি অঙ্কনযোগ্যকে স্কেলিংয়ের সময় পিক্সিলেশন তৈরি করবে। এমনকি যদি তারা ভেক্টর ড্রয়যোগ্য হয়।
সংকেত বার্ডে

সম্ভবত ব্যবহার করতে চানContextCompat.getDrawable(context, resourceid)
পিয়েরে

পার্শ্ব নোট হিসাবে, আপনি StateListDrawableপ্রোগ্রামিয়ালি তৈরি করতে পারেন এবং addStateসেই "রূপান্তরিত অঙ্কনযোগ্য" এর সাহায্যে পদ্ধতিটি ব্যবহার করতে পারেন যাতে এটি selector's itemব্যবহৃত আকারের জন্য কাজ করে setPasswordVisibilityToggleDrawable
ফল 20

31

setBounds()50x50 আকারের ব্যবহারের জন্য আকারটি নির্দিষ্ট করুন

drawable.setBounds(0, 0, 50, 50);

সার্বজনীন অকার্যকর সেটবাউন্ডস (ইন বাম, অভ্যন্তরীণ শীর্ষ, ইন ডানদিকে, নিচের দিকের নীচে)


4
সেটবাউন্ডসের পরে আকার একই থাকে। কিছু অকার্যকর প্রয়োজন হতে পারে?
Kostadin

6
আসলে, সেটবাউন্ডস গ্রেডিয়েন্টড্রেইবলের পক্ষে কাজ করে। এটি কেবল চিত্র অঙ্কনযোগ্যদের জন্য কাজ করে না।
গ্রেগ

আমি যখন একটি বোতামে ছবিটি রাখছিলাম তখন এটি আমার পক্ষে কাজ করেছিল, তবে আমি যখন এটি কোনও চিত্র ভিউতে রাখি তখন নয়। ওপি একটি বোতাম ব্যবহার করছিল, তবে setCompoundDrawables()ফাংশনের অভ্যন্তরীণ স্বাদকেও ডেকেছিল ।
উইলিয়াম টি। ম্যালার্ড

@ গ্রেগ আকর্ষণীয়ভাবে, আপনি সেটসাইজ () ব্যবহার করে গ্রেডিয়েন্টড্রেইবলের জন্য আকারও সেট করতে পারেন।
6rchid

12

.SetBounds প্রয়োগ করার আগে (..) বর্তমান অঙ্কনযোগ্যকে স্কেলড্রেবলে রূপান্তর করার চেষ্টা করুন

drawable = new ScaleDrawable(drawable, 0, width, height).getDrawable();

তারপর

drawable.setBounds(0, 0, width, height);

কাজ করবে


4
কেন এই পদক্ষেপের প্রয়োজন? একটি মোড়ক কি না মোড়ক ScaleDrawableবিকল্প দেয়?
আজিজবিকিয়ান

10

সেটবাউন্ডস () পদ্ধতিটি প্রত্যাশার মতো বিটম্যাপ অঙ্কনযোগ্য কেন কাজ করছে না তা খনন করার আমার কাছে সময় নেই তবে সেটবাউন্ডগুলি কী করা উচিত তা করার জন্য আমার কাছে অল্প কিছু টুইট হয়েছে @ অ্যান্ড্রোইন-স্টুডিও সমাধান ...

/**
 * Created by ceph3us on 23.05.17.
 * file belong to pl.ceph3us.base.android.drawables
 * this class wraps drawable and forwards draw canvas
 * on it wrapped instance by using its defined bounds
 */
public class WrappedDrawable extends Drawable {

    private final Drawable _drawable;
    protected Drawable getDrawable() {
        return _drawable;
    }

    public WrappedDrawable(Drawable drawable) {
        super();
        _drawable = drawable;
    }

    @Override
    public void setBounds(int left, int top, int right, int bottom) {
        //update bounds to get correctly
        super.setBounds(left, top, right, bottom);
        Drawable drawable = getDrawable();
        if (drawable != null) {
            drawable.setBounds(left, top, right, bottom);
        }
    }

    @Override
    public void setAlpha(int alpha) {
        Drawable drawable = getDrawable();
        if (drawable != null) {
            drawable.setAlpha(alpha);
        }
    }

    @Override
    public void setColorFilter(ColorFilter colorFilter) {
        Drawable drawable = getDrawable();
        if (drawable != null) {
            drawable.setColorFilter(colorFilter);
        }
    }

    @Override
    public int getOpacity() {
        Drawable drawable = getDrawable();
        return drawable != null
                ? drawable.getOpacity()
                : PixelFormat.UNKNOWN;
    }

    @Override
    public void draw(Canvas canvas) {
        Drawable drawable = getDrawable();
        if (drawable != null) {
            drawable.draw(canvas);
        }
    }

    @Override
    public int getIntrinsicWidth() {
        Drawable drawable = getDrawable();
        return drawable != null
                ? drawable.getBounds().width()
                : 0;
    }

    @Override
    public int getIntrinsicHeight() {
        Drawable drawable = getDrawable();
        return drawable != null ?
                drawable.getBounds().height()
                : 0;
    }
}

ব্যবহার:

// get huge drawable 
final Drawable drawable = resources.getDrawable(R.drawable.g_logo);
// create our wrapper           
WrappedDrawable wrappedDrawable = new WrappedDrawable(drawable);
// set bounds on wrapper 
wrappedDrawable.setBounds(0,0,32,32); 
// use wrapped drawable 
Button.setCompoundDrawablesWithIntrinsicBounds(wrappedDrawable ,null, null, null);

ফলাফল

আগে: এখানে চিত্র বর্ণনা লিখুন পরে:এখানে চিত্র বর্ণনা লিখুন


কিভাবে প্যাডিং বাম যোগ করতে?
পুনর্বার 29

8

ব্যবহার করা

textView.setCompoundDrawablesWithIntrinsicBounds()

আপনার minSdkVersion বিল্ড.gradle এ 17 হওয়া উচিত

    defaultConfig {
    applicationId "com.example..."
    minSdkVersion 17
    targetSdkVersion 25
    versionCode 1
    versionName "1.0"
}

অঙ্কনযোগ্য আকার পরিবর্তন করতে:

    TextView v = (TextView)findViewById(email);
    Drawable dr = getResources().getDrawable(R.drawable.signup_mail);
    Bitmap bitmap = ((BitmapDrawable) dr).getBitmap();
    Drawable d = new BitmapDrawable(getResources(), Bitmap.createScaledBitmap(bitmap, 80, 80, true));

    //setCompoundDrawablesWithIntrinsicBounds (image to left, top, right, bottom)
    v.setCompoundDrawablesWithIntrinsicBounds(d,null,null,null);

3

পছন্দসই প্রভাব অর্জনের জন্য পোস্ট পদ্ধতিটি ব্যবহার করুন:

{your view}.post(new Runnable()
    {
        @Override
        public void run()
        {
            Drawable image = context.getResources().getDrawable({drawable image resource id});
            image.setBounds(0, 0, {width amount in pixels}, {height amount in pixels});
            {your view}.setCompoundDrawables(image, null, null, null);
        }
    });

3

সম্ভবত কিছুটা দেরি হয়েছে। তবে শেষ পর্যন্ত প্রতিটি পরিস্থিতিতে আমার জন্য কাজ করে এমন সমাধান এখানে।

ধারনাটি হ'ল স্থির অভ্যন্তরীণ আকার সহ একটি কাস্টম অঙ্কনযোগ্য তৈরি করা এবং অঙ্কন কাজটি মূল অঙ্কনীয়কে সরিয়ে দেওয়া।

Drawable icon = new ColorDrawable(){
        Drawable iconOrig = resolveInfo.loadIcon(packageManager);

        @Override
        public void setBounds(int left, int top, int right, int bottom){
            super.setBounds(left, top, right, bottom);//This is needed so that getBounds on this class would work correctly.
            iconOrig.setBounds(left, top, right, bottom);
        }

        @Override
        public void draw(Canvas canvas){
            iconOrig.draw(canvas);
        }

        @Override
        public int getIntrinsicWidth(){
            return  mPlatform.dp2px(30);
        }

        @Override
        public int getIntrinsicHeight(){
            return  mPlatform.dp2px(30);
        }
    };

এমপ্ল্যাটফর্ম কী?
ব্যাটশেভ

@ বাথেসেভা এটি কেবল এমন কিছু যা তিনি ডিপি থেকে পিক্সে রূপান্তর করার জন্য ব্যবহার করেন ...
অ্যান্ড্রয়েড বিকাশকারী

2

jkhouw1 উত্তরটি সঠিক একটি, তবে এতে কিছু বিবরণের অভাব রয়েছে, নীচে দেখুন:

এটি কমপক্ষে API> 21 এর পক্ষে অনেক সহজ Ass

val iconResource = context.resources.getIdentifier(name, "drawable", context.packageName)
val drawable = context.resources.getDrawable(iconResource, null)

সেই ভেক্টরড্রেবলের জন্য কেবল পছন্দসই আকার সেট করুন:

drawable.setBounds(0, 0, size, size)

এবং বোতামে অঙ্কনযোগ্য প্রদর্শন করুন:

button.setCompoundDrawables(null, drawable, null, null)

এটাই. তবে নোট করুন সেটম্পাউন্ডড্র্যাবেবলগুলি ব্যবহার করার জন্য (অন্তর্নিহিত সংস্করণ নয়)!


0

আপনি দর্শন প্রকারের একটি সাবক্লাস তৈরি করতে এবং onSizeChanged পদ্ধতিতে ওভাররাইড করতে পারেন।

আমি আমার টেক্সট ভিউগুলিতে স্কেলিং যৌগের ড্রয়াবল রাখতে চেয়েছিলাম যা এক্সএমএল ইত্যাদিতে বিটম্যাপ ড্রইবলগুলি সংজ্ঞায়িত করে আমাকে গোলমাল করতে হবে না এবং এটি এইভাবে করেছেন:

public class StatIcon extends TextView {

    private Bitmap mIcon;

    public void setIcon(int drawableId) {
    mIcon = BitmapFactory.decodeResource(RIApplication.appResources,
            drawableId);
    }

    @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        if ((w > 0) && (mIcon != null))
            this.setCompoundDrawablesWithIntrinsicBounds(
                null,
                new BitmapDrawable(Bitmap.createScaledBitmap(mIcon, w, w,
                        true)), null, null);

        super.onSizeChanged(w, h, oldw, oldh);
    }

}

(মনে রাখবেন যে আমি দুইবার ডাব্লু ব্যবহার করেছি, এইচ নয়, এই ক্ষেত্রে আমি পাঠ্যের উপরে আইকনটি রাখছি এবং সুতরাং আইকনটির পাঠ্য দৃশ্যের মতো উচ্চতা হওয়া উচিত নয়)

এটি ব্যাকগ্রাউন্ডের ড্রয়যোগ্য বা অন্য কোনও কিছুর ক্ষেত্রে প্রয়োগ করা যেতে পারে যা আপনার দেখার আকারের তুলনায় আপনি পুনরায় আকার দিতে চান। onSizeChanged () কে প্রথমবার দেখা হয়ে ওঠার জন্য ডাকা হয়, সুতরাং আকারটি আরম্ভ করার জন্য আপনার কোনও বিশেষ ক্ষেত্রে দরকার নেই।


0

আপনি চেষ্টা করতে পারেন button.requestLayout()। যখন পটভূমির আকার পরিবর্তন করা হয় তখন এর পুনরুক্তি এবং বিন্যাস প্রয়োজন, তবে এটি এটি করবে না


0

লেয়ারড্রায়েবল ব্যবহার করে এই কাজটি পেয়েছেন:

fun getResizedDrawable(drawable: Drawable, scale: Float) =
    LayerDrawable(arrayOf(drawable)).also { it.setLayerSize(0, (drawable.intrinsicWidth * scale).toInt(), (drawable.intrinsicHeight * scale).toInt()) }

fun getResizedDrawable(drawable: Drawable, scalex: Float, scaleY: Float) =
    LayerDrawable(arrayOf(drawable)).also { it.setLayerSize(0, (drawable.intrinsicWidth * scalex).toInt(), (drawable.intrinsicHeight * scaleY).toInt()) }

fun getResizedDrawableUsingSpecificSize(drawable: Drawable, newWidth: Int, newHeight: Int) =
    LayerDrawable(arrayOf(drawable)).also { it.setLayerSize(0, newWidth, newHeight) }

উদাহরণ:

val drawable = AppCompatResources.getDrawable(this, android.R.drawable.sym_def_app_icon)!!
val resizedDrawable = getResizedDrawable(drawable, 3f)
textView.setCompoundDrawablesWithIntrinsicBounds(resizedDrawable, null, null, null)
imageView.setImageDrawable(resizedDrawable)

-1

আপনি কেবলমাত্র একটি স্তর এবং সেটলেয়ারসেট পদ্ধতি থেকে লেয়ারড্র্যাবেবল ব্যবহার করতে পারেন:

Drawable[] layers = new Drawable[1];
layers[0] = application.getResources().getDrawable(R.drawable.you_drawable);

LayerDrawable layerDrawable = new LayerDrawable(layers);
layerDrawable.setLayerInset(0, 10, 10, 10, 10);

-1

প্রশ্নটি জিজ্ঞাসা করার পরে
অনেক দিন হয়ে গেছে তবে কীভাবে এই সাধারণ জিনিসটি করা যায় তা এখনও অনেকের কাছে অস্পষ্ট।

আপনি যখন টেক্সটভিউ (বাটন) তে একটি যৌগিক অঙ্কনযোগ্য হিসাবে ড্রয়যোগ্যকে ব্যবহার করেন তখন এটি বেশ সহজ।

সুতরাং 2 টি জিনিস আপনাকে করতে হবে:

1.সেট সীমা:

drawable.setBounds(left, top, right, bottom)

2. সঠিকভাবে অঙ্কনযোগ্য সেট করুন (অভ্যন্তরীণ সীমানা ব্যবহার না করে):

button.setCompoundDrawablesRelative(drawable, null, null, null)
  • বিটম্যাপ ব্যবহার করার দরকার নেই
  • কোন হিসাবে যেমন সমাধান নীচে উপস্থিত ScaleDrawable ColorDrawableবাLayerDrawable (অন্যান্য উদ্দেশ্যে কী তৈরি করা হয়েছে)
  • কাস্টম অঙ্কনযোগ্য প্রয়োজন নেই!
  • এর সাথে কোনও কর্মক্ষেত্র নেই post
  • এটি একটি নেটিভ এবং সাধারণ সমাধান, Android কীভাবে আপনার কাছে প্রত্যাশা করে।

-42
Button button = new Button(this);
Button = (Button) findViewById(R.id.button01);

ব্যবহার করুন Button.setHeight()বা Button.setWeight()একটি মান সেট করুন ।


9
এটি কেবল বোতামের উচ্চতা নির্ধারণ করে, অঙ্কনযোগ্যগুলির উচ্চতা নয়। আমি অঙ্কনযোগ্য এর প্রস্থ / উচ্চতা সেট করতে চাই (বিশেষত এটি সেট বোতামের উচ্চতার চেয়ে বড় হলে)।

21
আপনি জানেন যে আপনি উত্তর মুছতে পারেন, তাই না?
ইহরব আল অসীম
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.