উপবৃত্তাকার = "মার্কি" সর্বদা স্ক্রোল করার কোনও উপায় আছে কি?


93

আমি একটি টেক্সটভিউতে মার্কি এফেক্টটি ব্যবহার করতে চাই, তবে টেক্সটভিউতে ফোকাস পাওয়া গেলে কেবল পাঠ্যটি স্ক্রোল করা হবে। এটি একটি সমস্যা, কারণ আমার ক্ষেত্রে এটি পারে না।

আমি ব্যাবহার করছি:

  android:ellipsize="marquee"
  android:marqueeRepeatLimit="marquee_forever"

টেক্সটভিউ সর্বদা এর পাঠ্যটি স্ক্রোল করার কোনও উপায় আছে কি? আমি এটি অ্যান্ড্রয়েড মার্কেট অ্যাপ্লিকেশনটিতে দেখছি, যেখানে অ্যাপ্লিকেশনটির নামটি শিরোনাম বারে স্ক্রোল করবে, এমনকি যদি এটি ফোকাস নাও পেয়ে থাকে তবে আমি এপিআই ডক্সে এটি উল্লেখ করা পাইনি।


মার্কি ওয়ার্ক করার জন্য টেক্সটভিউ নির্বাচন করা উচিত, ফোকাস নয়। ফোকাস নির্বাচন দেয় তবে বিপরীত নয়।
ডেনিস গ্ল্যাডকি

4
AlwaysMarqueeTextView চেষ্টা stackoverflow.com/a/28806003/3496570
AndroidGeek

আমি এই এক জন্য সঠিক উত্তর পরিবর্তন হবে stackoverflow.com/a/3700651/4548520
user25

উত্তর:


62

আমি সমস্যার মুখোমুখি হয়েছি এবং আমি যে সংক্ষিপ্ততম সমাধানটি নিয়ে এসেছি সেটি হ'ল টেক্সটভিউ থেকে প্রাপ্ত একটি নতুন শ্রেণি তৈরি করা। ক্লাসে টেক্সটভিউকে সমস্ত কেন্দ্রীভূত করতে ফোকাস চেঞ্জড , অন উইন্ডো ফোকাস চেঞ্জড এবং আইসফোকাসে তিনটি পদ্ধতি ওভাররাইড করা উচিত ।

@Override
protected void onFocusChanged(boolean focused, int direction, Rect previouslyFocusedRect) {
    if(focused)
        super.onFocusChanged(focused, direction, previouslyFocusedRect);
}

@Override
public void onWindowFocusChanged(boolean focused) {
    if(focused)
        super.onWindowFocusChanged(focused);
}


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

পারফেক্ট - এটি কেবলমাত্র সমাধান যা আমি সন্ধান করছিলাম।
জেসন

7
আপনার উইন্ডো ফোকাস পরিবর্তিত পদ্ধতিতে ওভাররাইড করা উচিত যদি আপনি চান মেনুগুলি পপ আপ হওয়ার পরে মার্কি থামবে না।
বিরসির

7
যাইহোক, আমাদের এই সমাধানটিতে আসলে সমস্যা ছিল, যেহেতু এটি রাষ্ট্রীয় ড্রয়াবলগুলিকে গণ্ডগোল করে: আপনি যদি ফোকাস-ইন / ফোকাস-আউট দিয়ে ড্রইবলগুলি পরিবর্তন করেন, তবে এটি ভেঙে যাবে। আমাদের ডিবাগিংয়ের প্রায় এক ঘন্টা সময় নিয়েছিল যতক্ষণ না আমরা বুঝতে পারি যে এই হ্যাকটি এর কারণ হয়ে দাঁড়িয়েছে।
ম্যাথিয়াস

আপনি কি এই সমস্যার আরও বিশদ বিবরণ দিতে পারবেন? আমি অনেক অ্যাপ্লিকেশনে এই বৈশিষ্ট্যটি ব্যবহার করি। আমি এই সমস্যাটিও একবার দেখে নিতে চাই।
hnviet

4
এই হ্যাকটি দুর্দান্ত কাজ করে এবং যখন একাধিক পাঠ্য ভিউগুলি একই সাথে পর্দায় থাকে তখনই প্রয়োজন হয় (যেমন তালিকাগুলিতে ব্যবহৃত হওয়ার সময়) - কারণ সাধারণত তাদের মধ্যে কেবল একটিকেই ফোকাস করা যেতে পারে তবে এই সমাধানটি সমস্ত কিছু জানিয়ে সিস্টেমটিকে 'কৌশল' দেয় হয় :) অন্যথায় একক টেক্সটভিউয়ের জন্য স্ট্যাকওভারফ্লো.com/a/3510891/258848 এর মতো সরল অ্যাওয়ার ব্যবহার করা উচিত।
ডিমসুজ

120

অবশেষে আমি আজ এই সমস্যার বিরুদ্ধে এসেছি এবং তাই hierarchyviewerঅ্যান্ড্রয়েড মার্কেট অ্যাপ্লিকেশনটিতে বরখাস্ত ।

কোনও অ্যাপের বিশদ স্ক্রিনে শিরোনামটি দেখে তারা পুরানো সরল ব্যবহার করে TextView। এর বৈশিষ্ট্যগুলি পরীক্ষা করে দেখা গেছে যে এটি মনোনিবেশ করা হয়নি, মনোনিবেশ করা যায়নি এবং সাধারণত খুব সাধারণ ছিল - এটি নির্বাচিত হিসাবে চিহ্নিত হিসাবে চিহ্নিত করা ছাড়া ।

কোডের একটি লাইন পরে এবং আমি এটি কাজ করেছিলাম :)

textView.setSelected(true);

জাভাদোক যা বলেছেন তা প্রদত্ত এটি উপলব্ধি করে :

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

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

দুর্ভাগ্যক্রমে, যতদূর আমি জানি লেআউট এক্সএমএল থেকে নির্বাচিত রাজ্যটিকে প্রাক-সেট করার কোনও উপায় নেই।
তবে উপরের ওয়ান-লাইনারটি আমার পক্ষে ভাল কাজ করে।


কেবল ভাবছি: এটি কি পাঠ্যদর্শনগুলির জন্যও কার্যকর হবে যা মনোনিবেশযোগ্য, তবে মনোযোগ না দেওয়া অবস্থায় এখনও স্ক্রোল করা উচিত? আইও, ফোকাসের রাজ্যের পরিবর্তন হয়ে গেলেও কি নির্বাচিত রাষ্ট্রটি "স্টিক" করে?
ম্যাথিয়াস

আমারও তাই ধারণা. আমি দেখতে পাচ্ছি না কেন মৌলিক TextView(যেমন একটি "নির্বাচনের যোগ্য" তে কোনও এম্বেড করা হয়নি) কেন্দ্রে কেন্দ্রীভূতকরণের ফলে কেন ListViewনির্বাচিত অবস্থার পরিবর্তন হবে।
ক্রিস্টোফার অর

এটি আমার পক্ষেও ভাল কাজ করে। আপনার উত্তর করার জন্য আপনাকে ধন্যবাদ। পুনরাবৃত্তির উপায় পরিবর্তন করার সম্ভাবনা আছে ?!
টিমা

@ মুর: হ্যাঁ, TextViewডকুমেন্টেশন পড়ুন এবং একবার দেখুন android:marqueeRepeatLimit
ক্রিস্টোফার অর 11

4
এই পদ্ধতিটি ফোকাসযুক্তের চেয়ে ভাল কারণ এটি দৃষ্টিভঙ্গির ফোকাসের সাথে গোলযোগ না করে। আপনার যদি এমন মতামত থাকে যাগুলির জন্য তাদের পিতামাতাকে ফোকাস করা প্রয়োজন, এই পদ্ধতিটি ফোকাসটিকে বিশৃঙ্খলা করবে। এই পদ্ধতিটি সহজ, দক্ষ এবং প্রতিবার ফোকাস পরিবর্তনের জন্য হ্যাকগুলির উপর নির্ভর করে না। ধন্যবাদ!
আয়নুত নেগ্রু

75

এই টেক্সটভিউতে এই পরামিতিগুলি রাখুন। এটি কাজ করে :)

    android:singleLine="true" 
    android:ellipsize="marquee"
    android:marqueeRepeatLimit ="marquee_forever"
    android:scrollHorizontally="true"
    android:focusable="true"
    android:focusableInTouchMode="true" 

4
যদি এই উত্তর থ্রেডটি ইতিমধ্যে মারা যায় না, তবে আমার মতে এটি গ্রহণযোগ্য উত্তর হওয়া উচিত। আমি এটি পাঠ্য দর্শনের জন্য আমার এক্সএমএল সংজ্ঞায় যুক্ত করেছি এবং এটি প্রথম শটে কাজ করেছে। আমি অন্যান্য পরামর্শ চেষ্টা করেছি, এবং এটি সবচেয়ে সহজ। - এছাড়াও, "অ্যান্ড্রয়েড: মার্কি রেপিট্যলিমিট =" মার্কি_ফরভার "যুক্ত করে এটি অনির্দিষ্টকালের জন্য স্ক্রোল করে তোলে
22:41

19
এটি ব্যবহার করে যদি টেক্সটভিউ এর ভিতরে থাকে তবে তালিকাভিউ সারিটির ফোকাস নির্বাচনটি বিরতি দেয়।
Tivie

পুরোপুরি কাজ করে। সহজ এবং মার্জিত সমাধান। ধন্যবাদ!
রাবি

টেক্সটভিউয়ের মার্কি কীভাবে শুরু করবেন এবং বন্ধ করবেন
দ্বিবেদী জি

আমি অন্য উত্তর - টেক্সটভিউ.সেটসলেক্টেড (সত্য) চেষ্টা না করা পর্যন্ত এটি আমার পক্ষে কার্যকর হয়নি;
জাস্টিন

13

TranslateAnimationনির্দিষ্ট পরিমাণ দ্বারা ভিউকে এক দিকে "টান" দিয়ে কাজ করে। এই "টানতে" কোথায় শুরু করতে হবে এবং কোথায় শেষ হবে তা আপনি সেট করতে পারেন।

TranslateAnimation(fromXDelta, toXDelta, fromYDelta, toYDelta);

fromXDelta এক্স অক্ষগুলিতে চলাচলের শুরু অবস্থানের অফসেট সেট করে।

fromXDelta = 0 //no offset. 
fromXDelta = 300 //the movement starts at 300px to the right.
fromXDelta = -300 //the movement starts at 300px to the left

টেক্সডেল্টা এক্স অক্ষের মধ্যে চলাচলের অফসেট সমাপ্ত অবস্থান নির্ধারণ করে।

toXDelta = 0 //no offset. 
toXDelta = 300 //the movement ends at 300px to the right.
toXDelta = -300 //the movement ends at 300px to the left.

যদি আপনার পাঠ্যের প্রস্থটি এক্সডেল্টা এবং এক্সডেল্টা থেকে পার্থক্যের মডিউলের বেশি হয় তবে পাঠ্যটি পুরোপুরি স্ক্রিনের অভ্যন্তরে সরে যেতে সক্ষম হবে না।


উদাহরণ

ধরা যাক আমাদের পর্দার আকার 320x240 pxs s আমাদের কাছে একটি টেক্সটভিউ রয়েছে একটি পাঠ্য যার 700px প্রস্থ রয়েছে এবং আমরা একটি অ্যানিমেশন তৈরি করতে চাই যা পাঠ্যটিকে "টান" দেয় যাতে আমরা বাক্যাংশটির শেষ দেখতে পাই।

                                       (screen)
                             +---------------------------+
                             |<----------320px---------->|
                             |                           |
                             |+---------------------------<<<< X px >>>>
               movement<-----|| some TextView with text that goes out...
                             |+---------------------------
                             |  unconstrained size 700px |
                             |                           |
                             |                           |
                             +---------------------------+


                             +---------------------------+
                             |                           |
                             |                           |
               <<<< X px >>>>---------------------------+|
movement<----- some TextView with text that goes out... ||
                             ---------------------------+|
                             |                           |
                             |                           |
                             |                           |
                             +---------------------------+

প্রথমে আমরা সেট করেছিলাম fromXDelta = 0যাতে আন্দোলনের কোনও অফসেট না হয়। এখন আমাদের টেক্সডেল্টা মানটি চিহ্নিত করতে হবে। কাঙ্ক্ষিত প্রভাব অর্জনের জন্য আমাদের পাঠ্যটি ঠিক একই পিক্সের স্ক্রিনের বাইরে ছড়িয়ে দিতে হবে p (স্কিমটিতে <<<< এক্স পিএক্স >>>> দ্বারা প্রতিনিধিত্ব করা হয়েছে) যেহেতু আমাদের পাঠ্যের 700 প্রস্থ রয়েছে, এবং দৃশ্যমান অঞ্চলটি 320px (স্ক্রিনের প্রস্থ) আমরা সেট করেছি:

tXDelta = 700 - 320 = 380

এবং আমরা কীভাবে স্ক্রিন প্রস্থ এবং পাঠ্য প্রস্থকে চিত্রিত করব?


কোড

জারাহ স্নিপেটকে একটি শুরুর দিক হিসাবে গ্রহণ করা:

    /**
     * @param view The Textview or any other view we wish to apply the movement
     * @param margin A margin to take into the calculation (since the view
     *               might have any siblings in the same "row")
     *
     **/
public static Animation scrollingText(View view, float margin){

    Context context = view.getContext(); //gets the context of the view

            // measures the unconstrained size of the view
            // before it is drawn in the layout
    view.measure(View.MeasureSpec.UNSPECIFIED, 
                         View.MeasureSpec.UNSPECIFIED); 

            // takes the unconstrained wisth of the view
    float width = view.getMeasuredWidth();

            // gets the screen width
    float screenWidth = ((Activity) context).getWindowManager().getDefaultDisplay().getWidth();


            // perfrms the calculation
    float toXDelta = width - (screenWidth - margin);

            // sets toXDelta to 0 if the text width is smaller that the screen size
    if (toXDelta < 0) {toXDelta = 0; } else { toXDelta = 0 - toXDelta;}

            // Animation parameters
    Animation mAnimation = new TranslateAnimation(0, toXDelta, 0, 0);
    mAnimation.setDuration(15000); 
    mAnimation.setRepeatMode(Animation.RESTART);
    mAnimation.setRepeatCount(Animation.INFINITE);

    return mAnimation;
}

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


উপরে আমার উত্তর (যেমন কোডের একটি লাইন যুক্ত করুন textView.setSelected(true);) আপনার পরিস্থিতিতে কাজ করে না?
ক্রিস্টোফার অর

দুর্ভাগ্যক্রমে না. আমার প্রতিটি সারিতে বেশ কয়েকটি পাঠ্যদর্শন রয়েছে এমন তালিকাভুক্ত ছিল (সুতরাং স্থান সঙ্কট = পি)। পাঠ্যদর্শনটির প্রতিটি সারি ক্লিকযোগ্য এবং একটি প্রসঙ্গ মেনু পপ আপ করে। সেটটি সিলেক্ট করা সত্য হিসাবে প্রসঙ্গ মেনুটি ভেঙে যাচ্ছে বলে মনে হচ্ছে।
টিভি

তাই কি? বেশিরভাগ ক্ষেত্রেই ওভারশটের মতো হতে পারে। আমার জন্য, উপরে বর্ণিত কারণে, একমাত্র সমাধান ছিল। (এটি পুনরায় ব্যবহারযোগ্য,
বিটিডাব্লু

12

আপনার এখনও উত্তর প্রয়োজন কিনা তা আমি জানি না তবে আমি এটি করার একটি সহজ উপায় খুঁজে পেয়েছি।

আপনার অ্যানিমেশনটি এর মতো সেট আপ করুন:

Animation mAnimation = new TranslateAnimation(START_POS_X, END_POS_X, 
                START_POS_Y, END_POS_Y);
mAnimation.setDuration(TICKER_DURATION); 
mAnimation.setRepeatMode(Animation.RESTART);
mAnimation.setRepeatCount(Animation.INFINITE);

START_POS_X, END_POS_X, START_POS_Yএবং END_POS_Yহয় float, মান যখন TICKER_DURATIONএকজন intআমি আমার অন্যান্য ধ্রুবক ঘোষিত।

তারপরে আপনি এখন আপনার টেক্সটভিউতে এই অ্যানিমেশনটি প্রয়োগ করতে পারেন:

TextView tickerText = (TextView) findViewById(R.id.ticker);
tickerText.setAnimation(mAnimation);

এবং এটাই. :)

আমার অ্যানিমেশনটি ডান দিকের অফ-স্ক্রিন (300f) থেকে শুরু হয় এবং বাম পাশের অফ-স্ক্রিন (-300f) এ শেষ হবে, 15s (15000) এর সময়কাল নিয়ে।


4
এটি খুব সহজ বলে মনে হচ্ছে না। তবে আমি মনে করি না তার এখনও উত্তর দরকার আছে; উপরে গৃহীত উত্তরটি দেখুন .. :)
ক্রিস্টোফার অর

4
তবে আমি মনে করি একটি নতুন ক্লাস তৈরির চেয়ে সমাধানটি সহজ। : ডি যেমনটি হ'ল, অ্যানিমেট অবজেক্টটি আপনি যে অন্যান্য ভিটেমেটকে প্রাণবন্ত করতে চান তার জন্য পুনরায় ব্যবহার করতে পারেন। ;)
জারাহ

এটি যদিও ভাল কাজ করে তবে দীর্ঘ পাঠ্য প্রদর্শন করতে আমার কী করা উচিত ?! এখন আমার পাঠ্যটি কেবল অঙ্কিত হবে
টিমা

@ মুর ভোটিমা: আপনি কি আপনার টেক্সটভিউয়ের প্রস্থকে মোড়ানো_ কনটেন্টে সেট করার চেষ্টা করেছেন?
জারাহ

4
কোনও দুর্দান্ত সমাধান নয়, কারণ আকার এবং সময়কাল পরামিতিগুলি পাঠ্যের আকারের উপর নির্ভরশীল dependent আরও, পাঠ্য দৈর্ঘ্য দেখার প্রস্থের চেয়ে কম হলেও অ্যানিমেট করবে। setSelected (সত্য) হ'ল সত্যই সহজ সমাধান।
আনম

5

আমি মার্কি টেক্সট আইটেম সহ একটি তালিকাভিউয়ের জন্য নিম্নলিখিত কোডটি লিখেছি। এটি উপরে বর্ণিত সেটলেসড সলিউশন ভিত্তিক। মূলত, আমি অ্যারেএডাপ্টারের ক্লাসটি প্রসারিত করছি এবং ফেরত পাঠানোর আগে টেক্সটভিউ নির্বাচন করার জন্য গেটভিউ পদ্ধতিটি ওভাররাইড করছি:

    // Create an ArrayAdapter which selects its TextViews before returning      
    // them. This would enable marqueeing while still making the list item
    // clickable.
    class SelectingAdapter extends ArrayAdapter<LibraryItem>
    {
        public
        SelectingAdapter(
            Context context, 
            int resource, 
            int textViewResourceId, 
            LibraryItem[] objects
        )
        {
            super(context, resource, textViewResourceId, objects);
        }

        @Override
        public
        View getView(int position, View convertView, ViewGroup parent)
        {
            View view = super.getView(position, convertView, parent);
            TextView textview = (TextView) view.findViewById(
                R.id.textview_playlist_item_title
            );
            textview.setSelected(true);
            textview.setEnabled(true);
            textview.setFocusable(false);
            textview.setTextColor(0xffffffff);
            return view;

        }
    }

1

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

//XML
        <TextView
            android:id="@+id/blank_title"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:padding="5dp"
            android:layout_gravity="center_horizontal|center_vertical"
            android:background="#a4868585"
            android:textColor="#fff"
            android:textSize="15sp"
            android:singleLine="true"
            android:lines="1"
            android:ellipsize="marquee"
            android:marqueeRepeatLimit ="marquee_forever"
            android:scrollHorizontally="true"
            android:focusable="true"
            android:focusableInTouchMode="true"
            tools:ignore="Deprecated" />

//JAVA
    titleText.setOnFocusChangeListener(new View.OnFocusChangeListener() {
        @Override
        public void onFocusChange(View v, boolean hasFocus) {
            if (!hasFocus) {
                titleText.setSelected(true);
            }
        }
    });

1

// এক্সএমএল

 <TextView
            android:id="@+id/tvMarque"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:ellipsize="marquee"
            android:layout_gravity="center_horizontal"
            android:fadingEdge="horizontal"
            android:marqueeRepeatLimit="marquee_forever"
            android:scrollHorizontally="true"
            android:padding="5dp"
            android:textSize="16sp"
            android:text=""
            android:textColor="@color/colorSyncText"
            android:visibility="visible" />

// জাভাতে

        mtvMarque.setEllipsize(TextUtils.TruncateAt.MARQUEE);
        mtvMarque.setSelected(true);
        mtvMarque.setSingleLine(true);
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.