我在Android应用程序中创建了一个CustomeEditText,用于在右侧Drawable上分配一个可绘制的点击。
课程如下。
public class CustomEditText extends EditText {
private Drawable drawableRight;
private Drawable drawableLeft;
private Drawable drawableTop;
private Drawable drawableBottom;
int actionX, actionY;
int mHeight = 0;
private DrawableClickListener clickListener;
public CustomEditText(Context context) {
super(context);
}
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) {
mHeight = h;
super.onSizeChanged(w, h, oldw, oldh);
}
@Override
public void setCompoundDrawables(Drawable left, Drawable top,
Drawable right, Drawable bottom) {
Log.v("Login", "setCompoundDrawables");
if (left != null) {
Log.v("Login", "Left Not Null");
drawableLeft = left;
}
if (right != null) {
drawableRight = right;
}
if (top != null) {
drawableTop = top;
}
if (bottom != null) {
drawableBottom = bottom;
}
Log.v("CustomeEditText", "Left :"+left);
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;
}
public interface DrawableClickListener {
public static enum DrawablePosition {
TOP, BOTTOM, LEFT, RIGHT
};
public void onClick(DrawablePosition target);
}
}
所以在xml中
<com.mypack.CustomEditText
android:id="@+id/category"
android:layout_width="wrap_content"
android:layout_height="40dp"
android:layout_margin="2dp"
android:background="@drawable/b"
android:drawablePadding="10dp"
android:drawableRight="@drawable/category"
android:hint="My hint"
android:padding="10dp"
android:textColor="#000000"
android:textSize="15sp"
android:textStyle="bold" />
现在我想通过代码创建相同的视图。
我试图像这样创作
CustomEditText example = new CustomEditText(this);
Log.v("Login", "message");
example.setCompoundDrawables(getResources().getDrawable(R.drawable.delete_category), null, null, null);
example.setBackgroundResource(R.drawable.category_background);
example.setGravity(Gravity.CENTER);
example.setTextColor(getResources().getColor(
android.R.color.white));
//example.setMargins(4, 4, 4, 4);
example.setPadding(4, 4, 4, 4);
example.setTextSize(20);
example.setText(category);
ll.addView(example);
它正在创建一个普通的edittext而不在左侧绘制。如何在右侧创建一个带有Drawable的CustomeEditText。
答案 0 :(得分:1)
你应该使用
example.setCompoundDrawablesWithIntrinsicBounds(getResources().getDrawable(R.drawable.delete_category), null, null, null);
而不是
example.setCompoundDrawables(getResources().getDrawable(R.drawable.delete_category), null, null, null);
这将导致您的自定义EditText
左侧显示Drawable
。
所以你的代码就像:
CustomEditText example = new CustomEditText(this);
Log.v("Login", "message");
example.setCompoundDrawablesWithIntrinsicBounds(getResources().getDrawable(R.drawable.delete_category), null, null, null);
example.setBackgroundResource(R.drawable.category_background);
example.setGravity(Gravity.CENTER);
example.setTextColor(getResources().getColor(
android.R.color.white));
//example.setMargins(4, 4, 4, 4);
example.setPadding(4, 4, 4, 4);
example.setTextSize(20);
example.setText(category);
ll.addView(example);
<强> 1。 setCompoundDrawable用于添加Drawables:
如果要使用setCompoundDrawable
添加Drawables
,则需要使用setBounds指定边界。这将定义图像周围的边界矩形。如果您不这样做,您将无法看到Drawable
。
例如。在你的情况下使用它,
Drawable img = getResources().getDrawable(R.drawable.delete_category);
img.setBounds( 0, 0, 60, 60 );
example.setCompoundDrawables(img, null, null, null);
<强> 2。 setCompoundDrawableWithIntrinsicBounds添加Drawables:
您可以改用setCompoundDrawableWithIntrinsicBounds()
。它将使用图像的大小作为Drawable
的大小。即Drawables的界限将设定为其内在界限。
答案 1 :(得分:-1)
机器人:比重= “右”
将它放在你的xml或setGravity(Gravity.RIGHT);