我为一个按钮和不同的按钮状态做了一个自定义背景。但现在我说到了一个我不能理解的地方。
当按钮处于正常状态时,它看起来很好。但当我按下按钮时,我需要将文本向下移动几个像素,因为按钮背景图像正在移动(实际上感觉像是它在图像上移动,因为首先在按钮下有边框,当它处于按下状态时,这个边框就会消失)。请看下面的图片。
当按钮状态被按下时,如何移动按钮中的按钮文本?(可能会以某种方式填充或自定义按钮的布局)
发布于 2011-10-07 00:00:02
我自己没有试过,但如果你使用九补丁作为两个状态的背景可绘制,那么你应该考虑在按下状态可绘制中设置适当的填充框。请参阅详细信息here。
发布于 2011-10-07 00:22:21
您可以在视图上使用填充。您可以将OnTouchListener添加到按钮或视图,如下所示
viewF.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if (event.getAction == MotionEvent.ACTION_UP) {
//set your padding
} else if (event.getAction == MotionEvent.ACTION_DOWN){
//set your padding
}
return true;
}
});
当按钮被按下或没有被按下时,触摸式监听器会让你知道。
发布于 2014-10-15 14:58:32
比覆盖setPressed()更糟糕的是Pēteris Caune答案。但在你在ICS或更低版本的设备上测试你的应用程序并将按钮添加为列表视图项目之前,setPressed一切都没问题。为了实现这一点,我改进了按钮的类:
public class OffsetButton extends Button {
private static final int OFFSET_IN_DP = 6;
private int offset_in_px;
private boolean wasPressed = false;
private Integer[] defaultPaddings;
public OffsetButton(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
initView();
}
public OffsetButton(Context context, AttributeSet attrs) {
super(context, attrs);
initView();
}
public OffsetButton(Context context) {
super(context);
initView();
}
private void initView() {
offset_in_px = (int) DisplayUtil.convertDpToPixel(OFFSET_IN_DP);
}
@Override
public void setPressed(boolean pressed) {
if (pressed && !wasPressed) {
changePaddings();
}
if (!pressed && wasPressed) {
resetPaddings();
}
super.setPressed(pressed);
}
private void changePaddings() {
defaultPaddings = new Integer[]{getPaddingLeft(), getPaddingTop(), getPaddingRight(), getPaddingBottom()};
setPadding(getPaddingLeft(), getPaddingTop() + offset_in_px, getPaddingRight(), getPaddingBottom() - offset_in_px);
wasPressed = true;
}
private void resetPaddings() {
setPadding(defaultPaddings[0], defaultPaddings[1], defaultPaddings[2], defaultPaddings[3]);
wasPressed = false;
}
@Override
public boolean performClick() {
resetPaddings();
return super.performClick();
}
@Override
public boolean onTouchEvent(MotionEvent event) {
if (isEnabled())
{
if (event.getAction() == MotionEvent.ACTION_DOWN && !wasPressed) {
changePaddings();
} else if (event.getAction() == MotionEvent.ACTION_UP && wasPressed) {
resetPaddings();
}
}
return super.onTouchEvent(event);
}
}
https://stackoverflow.com/questions/7676986
复制相似问题