TextView在最后一行设置图像

时间:2017-10-11 09:14:13

标签: java android textview

有没有办法将图像放在TextView的最后一行

我使用setCompoundDrawablesWithIntrinsicBounds。关于它的一些想法会很好。

此外,我只需要处理我的图片点击。此行为由以下代码表示:

   textView.setCompoundDrawablesWithIntrinsicBounds(0, 0, R.drawable.info, 0);
                textView.setOnTouchListener(new View.OnTouchListener() {
                    @Override
                    public boolean onTouch(View v, MotionEvent event) {
                        if(event.getAction() == MotionEvent.ACTION_UP) {
                            if(event.getRawX() >= textView.getRight() - textView.getTotalPaddingRight()){

                                listener.onAddressClicked(livingAreas);

                                return true;
                            }
                        }
                        return true;
                    }
                });

3 个答案:

答案 0 :(得分:2)

使用“文本”视图,您可以在确定的位置设置绘图。

您可以使用此xml示例:

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:drawableBottom="@drawable/image"
    android:text="blablabla"/>

编程:

  

public void setCompoundDrawables(Drawable left, Drawable top, Drawable right, Drawable bottom)

text_view.setCompoundDrawables(null, null, null, getDrawable(drawable_image_id));

答案 1 :(得分:0)

使用SpannableString,以便在文字中加入图片。有关代码示例,请检查this question and answer

答案 2 :(得分:0)

自定义文字视图: -

public class CustomEditText扩展android.support.v7.widget.AppCompatTextView

{

private Drawable drawableRight;
private Drawable drawableLeft;
private Drawable drawableTop;
private Drawable drawableBottom;

int actionX, actionY;

private DrawableClickListener clickListener;

public CustomEditText(Context context, AttributeSet attrs) {
    super(context, attrs);
    // this Contructure required when you are using this view in xml
}

public CustomEditText(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);        
}

protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);

}

@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
    super.onSizeChanged(w, h, oldw, oldh);
}

@Override
public void setCompoundDrawables(Drawable left, Drawable top,
        Drawable right, Drawable bottom) {
    if (left != null) {
        drawableLeft = left;
    }
    if (right != null) {
        drawableRight = right;
    }
    if (top != null) {
        drawableTop = top;
    }
    if (bottom != null) {
        drawableBottom = bottom;
    }
    super.setCompoundDrawables(left, top, right, bottom);
}

@Override
public boolean onTouchEvent(MotionEvent event) {
    Rect bounds;
    if (event.getAction() == MotionEvent.ACTION_DOWN) {
        actionX = (int) event.getX();
        actionY = (int) event.getY();
        if (drawableBottom != null
                && drawableBottom.getBounds().contains(actionX, actionY)) {
            clickListener.onClick(DrawableClickListener.DrawablePosition.BOTTOM);
            return super.onTouchEvent(event);
        }

        if (drawableTop != null
                && drawableTop.getBounds().contains(actionX, actionY)) {
            clickListener.onClick(DrawableClickListener.DrawablePosition.TOP);
            return super.onTouchEvent(event);
        }

        // this works for left since container shares 0,0 origin with bounds
        if (drawableLeft != null) {
            bounds = null;
            bounds = drawableLeft.getBounds();

            int x, y;
            int extraTapArea = (int) (13 * getResources().getDisplayMetrics().density  + 0.5);

            x = actionX;
            y = actionY;

            if (!bounds.contains(actionX, actionY)) {
                /** Gives the +20 area for tapping. */
                x = (int) (actionX - extraTapArea);
                y = (int) (actionY - extraTapArea);

                if (x <= 0)
                    x = actionX;
                if (y <= 0)
                    y = actionY;

                /** Creates square from the smallest value */
                if (x < y) {
                    y = x;
                }
            }

            if (bounds.contains(x, y) && clickListener != null) {
                clickListener
                        .onClick(DrawableClickListener.DrawablePosition.LEFT);
                event.setAction(MotionEvent.ACTION_CANCEL);
                return false;

            }
        }

        if (drawableRight != null) {

            bounds = null;
            bounds = drawableRight.getBounds();

            int x, y;
            int extraTapArea = 13;

            /**
             * IF USER CLICKS JUST OUT SIDE THE RECTANGLE OF THE DRAWABLE
             * THAN ADD X AND SUBTRACT THE Y WITH SOME VALUE SO THAT AFTER
             * CALCULATING X AND Y CO-ORDINATE LIES INTO THE DRAWBABLE
             * BOUND. - this process help to increase the tappable area of
             * the rectangle.
             */
            x = (int) (actionX + extraTapArea);
            y = (int) (actionY - extraTapArea);

            /**Since this is right drawable subtract the value of x from the width 
            * of view. so that width - tappedarea will result in x co-ordinate in drawable bound. 
            */
            x = getWidth() - x;

             /*x can be negative if user taps at x co-ordinate just near the width.
             * e.g views width = 300 and user taps 290. Then as per previous calculation
             * 290 + 13 = 303. So subtract X from getWidth() will result in negative value.
             * So to avoid this add the value previous added when x goes negative.
             */

            if(x <= 0){
                x += extraTapArea;
            }

             /* If result after calculating for extra tappable area is negative.
             * assign the original value so that after subtracting
             * extratapping area value doesn't go into negative value.
             */

            if (y <= 0)
                y = actionY;                

            /**If drawble bounds contains the x and y points then move ahead.*/
            if (bounds.contains(x, y) && clickListener != null) {
                clickListener
                        .onClick(DrawableClickListener.DrawablePosition.RIGHT);
                event.setAction(MotionEvent.ACTION_CANCEL);
                return false;
            }
            return super.onTouchEvent(event);
        }           

    }
    return super.onTouchEvent(event);
}

@Override
protected void finalize() throws Throwable {
    drawableRight = null;
    drawableBottom = null;
    drawableLeft = null;
    drawableTop = null;
    super.finalize();
}

public void setDrawableClickListener(DrawableClickListener listener) {
    this.clickListener = listener;
}

}

设置Drawable: -

<utils.CustomTextView
            android:id="@+id/tvMessage"
            android:textColor="@color/black"
            android:gravity="start"
            android:drawableRight="@drawable/ic_send_black_24dp"
            android:layout_marginRight="@dimen/dp_5"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />

//You can also set your drawable using java code

设置ClickListener: -

  tvTextView.setDrawableClickListener(target ->
            {

                //Your code

            }
    );