অ্যান্ড্রয়েড: ফিল্টারগুলি সহ একটি স্টেটলিস্টড্র্যায়েবল করার জন্য একটি অঙ্কনযোগ্য ক্লোনিং


91

আমি একটি সাধারণ কাঠামো ফাংশন তৈরির চেষ্টা করছি যা চাপানো / ফোকাসড / নির্বাচিত / ইত্যাদি যখন কোনও অঙ্কনযোগ্যকে হাইলাইট করে তোলে ।

আমার ফাংশনটি একটি অঙ্কনযোগ্য এবং একটি স্টেটলিস্টড্র্যাবেলকে ফিরিয়ে দেয়, যেখানে ডিফল্ট রাষ্ট্রটি নিজেই android.R.attr.state_pressedঅঙ্কনযোগ্য হয় এবং এর জন্য রাজ্যটি একই আঁকিয়ে যায় , কেবলমাত্র একটি ফিল্টার ব্যবহার করে প্রয়োগ করা হয় setColorFilter

আমার সমস্যাটি হ'ল আমি অঙ্কনযোগ্যকে ক্লোন করতে পারি না এবং ফিল্টার প্রয়োগের সাথে এটির একটি পৃথক উদাহরণ তৈরি করতে পারি না। আমি যা অর্জন করতে চাইছি তা এখানে:

StateListDrawable makeHighlightable(Drawable drawable)
{
    StateListDrawable res = new StateListDrawable();

    Drawable clone = drawable.clone(); // how do I do this??

    clone.setColorFilter(0xFFFF0000, PorterDuff.Mode.MULTIPLY);
    res.addState(new int[] {android.R.attr.state_pressed}, clone);
    res.addState(new int[] { }, drawable);
    return res;
}

যদি আমি ক্লোন না করে তবে ফিল্টারটি অবশ্যই উভয় রাজ্যেই প্রয়োগ করা হয়। আমি খেলতে চেষ্টা করেছিলাম mutate()কিন্তু তাতে কোন লাভ হয় না ..

কোন ধারনা?

হালনাগাদ:

গৃহীত উত্তর প্রকৃতপক্ষে একটি আকর্ষণীয় ক্লোন। যদিও এটি আমার সাধারণ ফাংশনটি অন্য কোনও সমস্যাতে ব্যর্থ হয়েছে তা আমাকে সাহায্য করেনি। দেখে মনে হচ্ছে আপনি যখন কোনও স্টেটলিস্টে একটি অঙ্কনযোগ্য যোগ করবেন তখন এটি তার সমস্ত ফিল্টার হারাবে।


হাই, আপনি কী ফিল্টারগুলি হারাতে পারবেন তার সমাধান খুঁজে পেয়েছেন? আমি একই সমস্যা পড়েছেন :( আমি বিটম্যাপ ক্লোনিং এবং ফিল্টার পিক্সেল বাই পিক্সেল প্রয়োগের দ্বারা উৎস চিত্র থেকে অন্যান্য ইমেজ জেনারেট করার শেষ পর্যন্ত হ্যাঁ, এই অদক্ষ, কিন্তু আমি একবার প্রক্রিয়া ছোট ইমেজ শুধু একটি গুচ্ছ
port443

আমি এটি স্টেটলিস্টড্র্যায়েবলের সাথে সমাধান করতে পারিনি, তবে আপনি যদি স্টেটলিস্টড্র্যাবেবল ব্যবহার করছেন না এবং এখনও আপনার ফিল্টারগুলি হারাচ্ছেন তবে আপনার বিটম্যাপগুলি পরিবর্তনযোগ্য কিনা তা নিশ্চিত করুন। সেখানে ভাল সংশ্লিষ্ট প্রশ্ন হলো stackoverflow.com/questions/5499637/... , এছাড়াও আমি জানতে পেরেছি যে LightingColorFilter জায়গায় যেখানে PorterDuff ব্যর্থ .. Lovin এই Android :) কাজ করে
talkol

এই লিঙ্কটির একটি দুর্দান্ত উত্তর stackoverflow.com/questions/10889415/…
অ্যালান

ট্রিগারযুক্ত একটি অনুরূপ পার্শ্ব প্রতিক্রিয়া রয়েছে ImageView.setImageDrawable, যা আমি গৃহীত উত্তরের জন্য ধন্যবাদ প্রায় কাজ করতে সক্ষম হয়েছি।
জিউলিও পিয়ানোস্টেলি

আমি একই জিনিসটি করার চেষ্টা করছি এবং এটি কোনওরকম প্রত্যাশার মতো কাজ করে, কালারফিল্টারটি হারিয়ে যায়নি ... পার্থক্যটি হ'ল আমি অঙ্কনীয়কে পরিবর্তন করলাম।
হেনরি

উত্তর:


163

নিম্নলিখিত চেষ্টা করুন:

Drawable clone = drawable.getConstantState().newDrawable();

4
ধন্যবাদ! এই পদ্ধতিটি সফলভাবে একটি অঙ্কনযোগ্য ক্লোন বলে মনে হচ্ছে। আমি যে ফাংশনটি লেখার চেষ্টা করেছিলাম তা কাজ করে না যদিও .. এটি মনে হয় যে কোনও অঙ্কনযোগ্য কোনও স্টেটলিস্টে isোকানো হলে এটির ফিল্টারগুলি হারিয়ে যায় :(
টকল

4
+1 আমাকে মানচিত্রের একটি খুব অদ্ভুত ত্রুটি ঠিক করতে সহায়তা করার জন্য যেখানে একটি সতর্কতা ডায়ালগের আইটেমাইজড ওভারলে থেকে একটি অঙ্কনযোগ্য পুনরায় ব্যবহার করে ট্রিগার করা হলে আইটেমাইজড ওভারলে স্থানান্তরিত করে made অঙ্কনযোগ্য একটি নতুন উদাহরণ তৈরি করা সমস্যার সমাধান করে।
kskjon

9
সঠিকভাবে কাজ করতে হবে, যদি আমরা সেট আলফা পদ্ধতিটি ব্যবহার করার চেষ্টা করি। এই ক্ষেত্রে উভয়ই অঙ্কনযোগ্য পরিবর্তন বিটম্যাপ। তারপরে আমি প্রথম অঙ্কনযোগ্য হিসাবে পেয়েছি: getRes श्रोत ()। GetDrawable (), দ্বিতীয় হিসাবে: getRes উত্স ()। GetDrawable ()। রূপান্তর ()।
ইউরা শিংকারেভ

অনেক ধন্যবাদ, আমি যখন এপিআই ম্যাপসফোরজ থেকে একটি বাউন্ডিং ফাংশন প্রয়োগ করি তখন আমার যে সমস্যাটি হয়েছিল তা ঠিক হয়েছিল। এখন আমি সাফল্যের সাথে সর্বত্র ড্রইবলগুলি ব্যবহার করতে পারি!
xarlymg89

18
@ ফ্লাভিও - আমি এটি একটি রঙিন ফিল্টার দিয়ে চেষ্টা করেছি, তবে এটি আমার আঁকার সমস্ত উদাহরণকে রঙিন করেছে! দেখা যাচ্ছে এটি দেখতে আপনাকে দেখতে পছন্দ করবে .mutate()(আমার উত্তর দেখুন)।
পিটার আজতাই

106

যদি আপনি একটি অঙ্কনযোগ্য তৈরির সাথে ফিল্টার / ইত্যাদি প্রয়োগ করেন getConstantState().newDrawable()তবে সেই অঙ্কনযোগ্য সমস্ত ঘটনাও পরিবর্তিত হবে, যেহেতু অঙ্কনযোগ্যরা constantStateক্যাশে হিসাবে ব্যবহার করে !

সুতরাং আপনি যদি একটি রঙিন ফিল্টার এবং একটি ব্যবহার করে একটি বৃত্ত রঙ করেন তবে আপনি newDrawable()সমস্ত চেনাশোনাগুলির রঙ পরিবর্তন করবেন।

যদি আপনি অন্য উদাহরণগুলিকে প্রভাবিত না করেই এই অঙ্কনযোগ্য আপডেটযোগ্য করে তুলতে চান তবে আপনাকে অবশ্যই এই বিদ্যমান ধ্রুবক অবস্থার পরিবর্তন করতে হবে।

// To make a drawable use a separate constant state
drawable.mutate()

একটি ভাল ব্যাখ্যার জন্য দেখুন:

http://www.curious-creature.org/2009/05/02/ শ্রাবনযোগ্য- পরিবর্তন

http://developer.android.com/references/android/ographicics/drawable/Drawable.html#mutate ()


বাস্তবে মিউটেট () একই একই উদাহরণটি ফিরে আসে, তবে এর অভ্যন্তরীণ পরিস্থিতি পরিবর্তন করা হয় যাতে রঙিন ফিল্টার প্রয়োগ করা অন্যান্য দৃষ্টান্তগুলিতে প্রভাব ফেলবে না। আপনি কি নিজের উত্তরটি পর্যালোচনা করে ঠিক করতে পারবেন?
clemp6r

4
@ ক্ল্যাম্প rr আপনি যদি রঙ পরিবর্তনের সমস্ত দৃষ্টান্তকে পরিবর্তন করতে না চান - কেবল ক্লোনটির রঙ পরিবর্তন করতে আপনাকে মিউটিকে কল করতে হবে
পিটার আজতাই

4
পরীক্ষা করে দেখুন এপিআই সুত্র ( "এই অঙ্কনযোগ্য চপল করুন -। রিটার্নস এই অঙ্কনযোগ্য") এবং সোর্স কোড ( "এই আসতে")। মিউটেট () কল করা প্রয়োজনীয়, তবে ফিরে আসা উদাহরণটি একই। এটি কোনও ক্লোন তৈরি করে না, এটি একই আঁকার অন্যান্য দৃষ্টান্তগুলিকে প্রভাবিত না করেই পরিবর্তনযোগ্য দৃষ্টান্তের অভ্যন্তরীণ অবস্থাকে পরিবর্তন করে।
clemp6r

ওয়েল আমি প্রশ্ন সম্পর্কে জানি না, কিন্তু এই উত্তর সঠিক জিনিস আমার প্রয়োজন ... Tu করে
Evren Ozturk

4
এগুলি হ'ল সেরা লিঙ্কগুলি, যা আপনি রেফারেন্সের জন্য দিয়েছিলেন
অশোক বর্মা

16

এটি আমার জন্য কাজ করে কি না।

Drawable clone = drawable.getConstantState().newDrawable().mutate();

হ্যাঁ আমি কেন জানি না তবে কেবলমাত্র এই সংমিশ্রণেই নিউ ড্রায়েবল () এবং মিউটেট () আমার জন্য কাজ করে অন্য কোনও একক মিউটেট () বা একক নতুনড্রেবল () আমার পক্ষে সঠিকভাবে কাজ করে না
Michał Ziobro

12

এই আমার প্রশ্নের ভিত্তিতে এটি আমার সমাধান ।

ধারণাটি হ'ল ImageViewব্যবহারকারীর স্পর্শ করলে রঙিন ফিল্টার পাওয়া যায় এবং ব্যবহারকারী তার স্পর্শ করা বন্ধ করলে রঙিন ফিল্টার সরিয়ে ফেলা হয়। কেবলমাত্র 1 টি অঙ্কনযোগ্য / বিটম্যাপ স্মৃতিতে রয়েছে, সুতরাং এটি নষ্ট করার দরকার নেই। এটি করা উচিত হিসাবে কাজ করে।

class PressedEffectStateListDrawable extends StateListDrawable {

    private int selectionColor;

    public PressedEffectStateListDrawable(Drawable drawable, int selectionColor) {
        super();
        this.selectionColor = selectionColor;
        addState(new int[] { android.R.attr.state_pressed }, drawable);
        addState(new int[] {}, drawable);
    }

    @Override
    protected boolean onStateChange(int[] states) {
        boolean isStatePressedInArray = false;
        for (int state : states) {
            if (state == android.R.attr.state_pressed) {
                isStatePressedInArray = true;
            }
        }
        if (isStatePressedInArray) {
            super.setColorFilter(selectionColor, PorterDuff.Mode.MULTIPLY);
        } else {
            super.clearColorFilter();
        }
        return super.onStateChange(states);
    }

    @Override
    public boolean isStateful() {
        return true;
    }
}

ব্যবহার:

Drawable drawable = new FastBitmapDrawable(bm);
imageView.setImageDrawable(new PressedEffectStateListDrawable(drawable, 0xFF33b5e5));

আমার জন্য কাজ করে! ধন্যবাদ একটি আকর্ষণীয় সমাধান, ধন্যবাদ!) পিএস অ্যান্ড্রয়েড সফলভাবে কাজ করছে না এমন এপিআই কার্যকর করছে :(
আন্তন কিজেমা

আমি মনে করি এটি (স্টেটলিস্টড্র্যাবল + বিটম্যাপড্রেবল) এর মধ্যে বাগগুলি সমাধানের জন্য এখন পর্যন্ত সেরা সমাধান!
জাভিয়ের.এস

1

আমি এখানে সম্পর্কিত একটি প্রশ্নের উত্তর দিয়েছি

মূলত এটি দেখে মনে হচ্ছে স্টেটলিস্টড্রেবলগুলি সত্যই তাদের ফিল্টারগুলি হারাবে। আমি মূলত আমি যে বিটম্যাপটি ব্যবহার করতে চেয়েছিলাম তার পরিবর্তিত অনুলিপি থেকে একটি নতুন বিটম্যাপড্রালে তৈরি করেছি।



0

ক্লোন অঙ্কনযোগ্য ব্যবহার করে পান newDrawable()তবে নিশ্চিত হয়ে নিন যে এটি পরিবর্তনীয় হবে অন্যথায় আপনার ক্লোন প্রভাবটি চলে গেছে, আমি কোডের এই কয়েকটি লাইন ব্যবহার করেছি এবং এটি প্রত্যাশার মতো কাজ করছে। getConstantState()টীকা দ্বারা প্রস্তাবিত নਾਲ হতে পারে, সুতরাং আপনি অঙ্কনযোগ্য ক্লোনিং করার সময় এই রানটাইম এক্সেপশন হ্যান্ডেল করুন।

Drawable.ConstantState state = d.mutate().getConstantState();
if (state != null) {
    Drawable drawable = state.newDrawable().mutate();
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.