0

カスタム ビューがあり、カスタム ビュー内に 4 つのテキスト ビューを作成します。これらの各テキスト ビューがタッチ イベントに応答するようにします。ただし、テキストビュー自体はオンタッチ イベントに応答しません。ただし、カスタム ビュー全体のオンタッチ リスナーを作成することはできます。ただし、作成したテキストビューをドラッグアンドドロップしたいので、ビュー全体に ontouch イベントを持たせたくありません。ontouch イベントの x 座標と y 座標を登録し、ontouch イベントが textview の境界内にある場合、textview の座標を変更すると仮定して、そのルートを試してみましたが、1 つの textview がドラッグされた場合、それは非常に複雑でした。別の座標に移動すると、ontouch イベントが他のテキストビューを「ピックアップ」するため、2 つのテキストビューを移動することになりますが、これは私が望むものではありません。そう、

                mScale.mPositive.get(0).setOnTouchListener(new OnTouchListener()
                    {
                        @Override
                        public boolean onTouch(View v, MotionEvent event) 
                        {
                                mScale.mCurrentXPos[0] = event.getX();
                                mScale.mCurrentYPos[0] = event.getY();
                                mScale.mDrag = true;

                            return true;
                        }

                    });

この同じコードはカスタム ビューでは機能しますが、そのカスタム ビュー内の特定のテキストビューでは機能しません。

カスタム ビュー コードは次のとおりです。

public class Scale extends View {

public Scale(Context context, AttributeSet attrs) 
{
    super(context, attrs);
    mContext = this.getContext();
            h = new Handler();
            mCalendarDbHelper=new CalendarDbAdapter(mContext);
            mCalendarDbHelper.open();
    Cursor thoughts = mCalendarDbHelper.fetchThoughts();

    //create a string array of negative thoughts from the db
        while (thoughts.moveToNext())
        {
            if (thoughts.getString(thoughts.getColumnIndexOrThrow(CalendarDbAdapter.COLUMN_NAME_THOUGHT)).length() > 0 && thoughts.getString(thoughts.getColumnIndexOrThrow(CalendarDbAdapter.COLUMN_NAME_THOUGHT)).charAt(0) == '-')
            {
                negative_thoughts.add(thoughts.getString(thoughts.getColumnIndexOrThrow(CalendarDbAdapter.COLUMN_NAME_THOUGHT)));
            }

        }
     thoughts.close();
     array_size = negative_thoughts.size();
     mBag =BitmapFactory.decodeResource(getResources(), R.drawable.bag);
     mGreenBag = BitmapFactory.decodeResource(getResources(), R.drawable.green_bag);

    for (int i = 0; i < 72; i ++)
    {
        try
        {
        mScale[i] = BitmapFactory.decodeStream(context.getAssets().open("scale_"+i+".gif"));
        }
        catch (IOException e) 
        {

        }
    }
}


private Runnable r= new Runnable() 
{

    @Override
    public void run() {
        invalidate();

    }

};


protected void onDraw (Canvas canvas)
{
    if (first == true)
    {
        width = this.getWidth();
        height = this.getHeight();
        mScale[i] = Bitmap.createScaledBitmap(mScale[i], (int) (width * 1.5), height, true);
        mBag = Bitmap.createScaledBitmap(mBag, width/2, height/2, true);
        negative = new TextView(mContext);
        word = negative_thoughts.get((int) (Math.random() * array_size));
        negative.setText(word);
        negative.layout(0, 0, width/3, height/4);
        negative.setGravity(Gravity.CENTER);
        negative.setTextSize(15);
        negative.setTextColor(Color.BLACK);
        negative.setTypeface(Typeface.DEFAULT_BOLD);
        negative.setShadowLayer(5, 2, 2, Color.WHITE);
        negative.setDrawingCacheEnabled(true);
        negative.setBackgroundResource(R.drawable.graycloud);
        positive_paint.setColor(Color.parseColor("#FF4444"));
        positive_paint.setShadowLayer(5, 2, 2, Color.YELLOW);
        positive_paint.setTypeface(Typeface.DEFAULT_BOLD);
        positive_paint.setTextSize(25);
        mCurrentXPos[0] = (width/2);
        mCurrentYPos[0] = height/4;
        mCurrentXPos[1] = (width/2) + (width/8);
        mCurrentYPos[1] = height/6;
        mCurrentXPos[2] = width/2;
        mCurrentYPos[2] = height/12;
        mCurrentXPos[3] = (width/2) + (width/8);
        mCurrentYPos[3] = height/18;
        mMoveXPos[0] = ((width/2) - width)/FRAME_RATE;
        mMoveYPos[0] = ((height/4) - (height + (height/4)))/FRAME_RATE;
        mMoveXPos[1] = (((width/2) + (width/8)) - width)/ FRAME_RATE;
        mMoveYPos[1] = ((height/6) - (height + (height/4)))/FRAME_RATE;
        mMoveXPos[2] = ((width/2) - width)/ FRAME_RATE;
        mMoveYPos[2] = ((height/12) - (height + (height/4)))/FRAME_RATE;
        mMoveXPos[3] = (((width/2) + (width/8)) - width)/ FRAME_RATE;
        mMoveYPos[3] = ((height/18) - (height + (height/4)))/FRAME_RATE;
        mMoveByXPos[0] = -(width/2)/ FRAME_RATE;
        mMoveByYPos[0] = -(height/4)/FRAME_RATE;
        mMoveByXPos[1] =  ((width - (width/3)) - (width/2 + (width/8)))/ FRAME_RATE;
        mMoveByYPos[1] = -(height/6)/FRAME_RATE;
        mMoveByXPos[2] = - (width/2)/ FRAME_RATE;
        mMoveByYPos[2] =  ((height) - (height/12))/FRAME_RATE;
        mMoveByXPos[3] =  ((width - (width/3)) - (width/2 + (width/8)))/ FRAME_RATE;
        mMoveByYPos[3] =  ((height) - (height/18))/FRAME_RATE;
        currentX = width;
        currentY = height + height/4;
        first = false;
    }


    if (game_over == false)
    {
        canvas.drawBitmap(mScale[i], 0 - (width/4), 0, null);
        canvas.drawBitmap(negative.getDrawingCache(),(int) (width/12), (int) (height - (height)/2.5) - (j), null);
    }

    else
    {
        canvas.drawBitmap(mBag, width/4, height/4, null);
    }

    if (mMoveScale == true)
    {
        i++;
        j+=3;
        ScaleIt(canvas, i);
        if (i == 21 || i == 37 || i == 53 || i == 71)
        {
            mMoveScale = false;
        }

    }

    if (tracker > 0)
    {
        if (tracker == 1)
        {
            if (currentX > width/2 && currentY > height/4 && sStop == false)
            {
                currentX += mMoveXPos[0]; 
                currentY += mMoveYPos[0];
                canvas.drawBitmap(mPositive.get(tracker -1 ).getDrawingCache(), currentX, currentY, null);

            }

            else 
            {
                if (sStop == false)
                {


                    mMoveScale = true;
                    sStop = true;
                    currentX = width;
                    currentY = height + height/4;
                    draw_em++;
                }

            }
        }


        if (tracker == 2)
        {

            if (currentX > width/2 + (width/8) && currentY > (height/6) && sStop == false)
            {
                currentX += mMoveXPos[1]; 
                currentY += mMoveYPos[1];
                canvas.drawBitmap(mPositive.get(tracker -1 ).getDrawingCache(), currentX, currentY, null);

            }

            else
            {
                if (sStop == false)
                {
                    mMoveScale = true;
                    sStop = true;
                    currentX = width;
                    currentY = height + height/4;
                    draw_em++;
                }
            }
        }


        if (tracker == 3)
        {

            if (currentX > width/2 && currentY > height/12 && sStop == false)
            {
                currentX += mMoveXPos[2]; 
                currentY += mMoveYPos[2];
                canvas.drawBitmap(mPositive.get(tracker -1 ).getDrawingCache(), currentX, currentY, null);

            }

            else 
            {
                if (sStop == false)
                {
                    mMoveScale = true;
                    sStop = true;
                    currentX = width;
                    currentY = height + height/4;
                    draw_em++;
                }
            }
        }

        if (tracker == 4)
        {

            if (currentX > width/2 + (width/8) && currentY > (height/18) && sStop == false)
            {
                currentX += mMoveXPos[3]; 
                currentY += mMoveYPos[3];
                canvas.drawBitmap(mPositive.get(tracker -1 ).getDrawingCache(), currentX, currentY, null);
            }

            else 
            {
                    if (sStop == false)
                    {
                    mMoveScale = true;
                    sStop = true;
                    game_over = true;
                    currentX = width;
                    currentY = height + height/4;
                    draw_em++;

                    }
            }
        }


        if (draw_em > 0 && game_over == false)
        {
            for (int i = 0; i < draw_em; i ++)
            {
            if (i == 0)
            {
                canvas.drawBitmap(mPositive.get(i).getDrawingCache(), width/2, height/4 + j, null);
            }
            if (i == 1)
            {
                canvas.drawBitmap(mPositive.get(i).getDrawingCache(), width/2 + (width/8), height/6 + j, null);

            }
            if (i == 2)
            {
                canvas.drawBitmap(mPositive.get(i).getDrawingCache(), width/2, height/12 + j, null);


            }
            if (i == 3)
            {
                canvas.drawBitmap(mPositive.get(i).getDrawingCache(), width/2 + (width/8), height/18 + j, null);
            }

        }

        }

        else if (game_over == true)
        {
            for (int i = 0; i < draw_em; i++)
            {
                if (i == 0 && mCurrentXPos[0] > 0 && mCurrentYPos[0] >  0 && mDrag == false)
                {

                    mCurrentXPos[0] += mMoveByXPos[0];
                    mCurrentYPos[0] += mMoveByYPos[0];
                    canvas.drawBitmap(mPositive.get(i).getDrawingCache(), mCurrentXPos[0], mCurrentYPos[0], null);
                }

                else if (i == 0 && mCurrentXPos[0] <= 0 || mCurrentYPos[0] <=  0 && mDrag == false)
                { 
                    canvas.drawBitmap(mPositive.get(0).getDrawingCache(), 0, 0, null);
                }

                else if (i == 0 && mDrag == true)
                {
                    canvas.drawBitmap(mPositive.get(0).getDrawingCache(), mCurrentXPos[0], mCurrentYPos[0], null);
                }

                if (i == 1 && mCurrentXPos[1] < (width - (mPositive.get(i).getWidth()/2)) && mCurrentYPos[1] >  mPositive.get(i).getHeight()/2)
                {
                    mCurrentXPos[1] += mMoveByXPos[1];
                    mCurrentYPos[1] += mMoveByYPos[1];
                    canvas.drawBitmap(mPositive.get(i).getDrawingCache(), mCurrentXPos[1], mCurrentYPos[1], null);

                }

                else if (i == 1 && mCurrentXPos[1] >= (width - (mPositive.get(i).getWidth()/2)) || mCurrentYPos[1] <=  mPositive.get(i).getHeight()/2)
                {
                    canvas.drawBitmap(mPositive.get(1).getDrawingCache(), width - (width/3), 0, null);
                }

                if (i == 2 && mCurrentXPos[2] > (mPositive.get(i).getWidth()/2) && mCurrentYPos[2] <  (height - mPositive.get(i).getHeight()/2))
                {
                    mCurrentXPos[2] += mMoveByXPos[2];
                    mCurrentYPos[2] += mMoveByYPos[2];
                    canvas.drawBitmap(mPositive.get(i).getDrawingCache(), mCurrentXPos[2], mCurrentYPos[2], null);
                }

                else if (i == 2 && mCurrentXPos[2] <= (mPositive.get(i).getWidth()/2) || mCurrentYPos[2] >=  (height - mPositive.get(i).getHeight()/2))
                {
                    canvas.drawBitmap(mPositive.get(2).getDrawingCache(), 0, height - (height/4), null);    
                }

                if (i == 3 && mCurrentXPos[3] < (width - (mPositive.get(i).getWidth()/2)) && mCurrentYPos[3] < (height - mPositive.get(i).getHeight()/2))
                {
                    mCurrentXPos[3] += mMoveByXPos[3];
                    mCurrentYPos[3] += mMoveByYPos[3];
                    canvas.drawBitmap(mPositive.get(i).getDrawingCache(), mCurrentXPos[3], mCurrentYPos[3], null);
                }

                else if (i == 3 && mCurrentXPos[3] >= (width - (mPositive.get(i).getWidth()/2)) || mCurrentYPos[3] >= (height - mPositive.get(i).getHeight()/2))
                {
                    canvas.drawBitmap(mPositive.get(3).getDrawingCache(), width - (width/3), height - (height/4), null);    
                }


            }
        }
    }
    h.postDelayed(r, FRAME_RATE);

}

protected void moveIt(Canvas canvas, int moveX,int moveY, int i)
{
    if (i == 0)
    {
        canvas.drawBitmap(mPositive.get(i).getDrawingCache(), moveX, moveY, null);
    }

    if (i == 1)
    {
        canvas.drawBitmap(mPositive.get(i).getDrawingCache(), moveX, moveY, null);
    }

    if (i == 2)
    {
        canvas.drawBitmap(mPositive.get(i).getDrawingCache(), moveX, moveY, null);
    }

    if (i == 3)
    {
        canvas.drawBitmap(mPositive.get(i).getDrawingCache(), moveX, moveY, null);

    }
}

protected void moveEm(Canvas canvas, int[]mMovePosX, int[] mMovePosY)
{
    for (int i = 0; i < 4; i++)
    {

    }
}

protected void ScaleIt(Canvas canvas, int i)
{
    mScale[i] = Bitmap.createScaledBitmap(mScale[i], (int) (width * 1.5), height, true);
    mScale[i-1].recycle();

}


}

そして、ここに活動があります:

 public class ScaleView extends Activity 
 {  
    Context mContext; 
Scale mScale;
EditText positive_thought;
Button fire;
TextView pos;
private static Set<String> mPositiveWords;
private static Set<String> mNegativeWords;
int count;
private Pattern four_letter_words = Pattern.compile("not|cant|cnt|can't"); 
String inputLine;
private String[] inputTokens;
Button question;
Button skip;

public static boolean populatePositiveWords(Context context)
{
    mNegativeWords = new HashSet<String>();


    try
    {
        BufferedReader reader = new BufferedReader(new InputStreamReader(context.getAssets().open("negative_words.txt")));          
        String line = reader.readLine();

        while (line != null)
        {
            mNegativeWords.add(line.toLowerCase(Locale.US));
            line = reader.readLine();
        }

        reader.close();
    }
    catch (IOException exception)
    {
        return false;
    }

    return true;
    //TODO list of negative words 
}



@Override
public void onCreate(Bundle savedInstanceState) 
{
    super.onCreate(savedInstanceState);
    this.getActionBar().hide();
    mContext = this;
    populatePositiveWords(mContext);
    setContentView(R.layout.activity_scale);
    mScale = (Scale) findViewById(R.id.anim_view);
    mScale.setClickable(true);
    positive_thought = (EditText) findViewById(R.id.thoughts);
    fire = (Button) findViewById(R.id.scale_it);
    skip = (Button) findViewById(R.id.skip);
    question = (Button) findViewById(R.id.question);
    InputFilter[] FilterArray = new InputFilter[1];
    FilterArray[0] = new InputFilter.LengthFilter(60);
    positive_thought.setFilters(FilterArray);


    fire.setOnClickListener(new OnClickListener()
    {
        @Override
        public void onClick(View view) 
        {
            //if the button is clicked invalidate the ondraw method and pass in the text of the positive word 
            inputLine = positive_thought.getText().toString();
            inputTokens = inputLine.split(" ");

            if (inputLine.isEmpty())
            {
                Toast.makeText(mContext, "You have to write something!", Toast.LENGTH_SHORT).show();
                return;                 
            }

            if (inputTokens.length < 3)
            {
                Toast.makeText(mContext, "At least three words are required.", Toast.LENGTH_SHORT).show();
                return;
            }               

            if (four_letter_words.matcher(inputLine).find() == true)
            {
                Toast.makeText(mContext, "Make an affirmative statement!", Toast.LENGTH_SHORT).show();
                return;
            }

            boolean matchesToken = false;

            for (int i = 0; i < inputTokens.length; i++)
            {
                String token = inputTokens[i];

                if (mNegativeWords.contains(token.toLowerCase(Locale.US)))
                {
                    matchesToken = true;
                    break;
                }
            }

            if (matchesToken == true)
            {
                Toast.makeText(mContext, "Use positive words!", Toast.LENGTH_SHORT).show();
                return;
            }

            else
            {

            InputMethodManager imm = (InputMethodManager)mContext.getSystemService(
                      Context.INPUT_METHOD_SERVICE);
                imm.hideSoftInputFromWindow(positive_thought.getWindowToken(), 0);
            pos = new TextView (mContext);
            pos.layout(0, 0, mScale.width/3, mScale.height/4);
            pos.setGravity(Gravity.CENTER);
            pos.setTextSize(15);
            pos.setTextColor(Color.RED);
            pos.setTypeface(Typeface.DEFAULT_BOLD);
            pos.setShadowLayer(5, 2, 2, Color.YELLOW);
            pos.setText(positive_thought.getText().toString());
            pos.setDrawingCacheEnabled(true);
            pos.setBackgroundResource(R.drawable.whitecloud);
            pos.setClickable(true);
            mScale.mPositive.add(pos);
            mScale.scale_it = true;
            count++;
            mScale.sStop = false;
            mScale.tracker = count;
            if (count == 4)
            {
                ((RelativeLayout)question.getParent()).removeView(question);
                ((RelativeLayout)skip.getParent()).removeView(skip);
                mScale.mPositive.get(0).setOnTouchListener(new OnTouchListener()
                    {
                        @Override
                        public boolean onTouch(View v, MotionEvent event) 
                        {
                                mScale.mCurrentXPos[0] = event.getX();
                                mScale.mCurrentYPos[0] = event.getY();
                                mScale.mDrag = true;
                                return true;
                        }

                    });


            }



            }
            positive_thought.setText(null);

        }
    });

}

}

4

2 に答える 2

1

TextView がタッチ イベントを受信できない理由は、TextView がビューとしてではなくビットマップとしてキャンバスに描画されるためです。以下に示すコードの抜粋は、これを示しています。

protected void onDraw(Canvas canvs)
{
    ....
    negative = new TextView(mContext);
    ...
    canvas.drawBitmap(negative.getDrawingCache(), ...)

タッチ イベントを TextView に配信するには、Scale クラスは View ではなく ViewGroup を拡張する必要があり、ViewGroup.addView() または addViewInLayout() を使用して、TextView を Scale クラスのサブビューとして追加する必要があります。ViewGroup サブクラスを実装するのは簡単な作業ではありません。必要に応じて onInterceptTouchEvent(MotionEvent) を実装する必要がある場合があります。

Android のソース コードが役立ちます。

于 2013-04-05T19:19:18.887 に答える
0

CustomView もいくつかの TouchListner を設定していますか?? はいの場合、これにより問題が発生する可能性があります..CustomView から TouchListner を削除し、それが機能するかどうかを確認してください..

于 2013-04-05T17:04:27.493 に答える