Почему бы не сделать обрезку в draw ()?
Вот мое решение:
код:
public class RoundRelativeLayout extends RelativeLayout {
private final float radius;
public RoundRelativeLayout(Context context, AttributeSet attrs) {
super(context, attrs);
TypedArray attrArray = context.obtainStyledAttributes(attrs,
R.styleable.RoundRelativeLayout);
radius = attrArray.getDimension(
R.styleable.RoundRelativeLayout_radius, 0);
}
private boolean isPathValid;
private final Path path = new Path();
private Path getRoundRectPath() {
if (isPathValid) {
return path;
}
path.reset();
int width = getWidth();
int height = getHeight();
RectF bounds = new RectF(0, 0, width, height);
path.addRoundRect(bounds, radius, radius, Direction.CCW);
isPathValid = true;
return path;
}
@Override
protected void dispatchDraw(Canvas canvas) {
canvas.clipPath(getRoundRectPath());
super.dispatchDraw(canvas);
}
@Override
public void draw(Canvas canvas) {
canvas.clipPath(getRoundRectPath());
super.draw(canvas);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int oldWidth = getMeasuredWidth();
int oldHeight = getMeasuredHeight();
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
int newWidth = getMeasuredWidth();
int newHeight = getMeasuredHeight();
if (newWidth != oldWidth || newHeight != oldHeight) {
isPathValid = false;
}
}
}
Это - то, как я разрешил его.
Примерно все в моем дополнении работает из метода Щелчка кнопки в UI. Я изменил все те методы Щелчка для строения только из простого, вызова без параметров.
Я затем создал новый файл (Частичный Класс) названный EntryPoint, который имел много очень короткого Друга Нижние индексы, каждые из которых обычно были одним или двумя вызовами к параметризованным функциям рабочего, так, чтобы все методы Щелчка, просто названные в этот файл. Так, например, существует функция, которая открывает стандартный документ и называет "сохранить Как" в наш DMS. Функция берет параметр который документ открыться, и существует несколько дюжин стандартных документов, которые мы используем.
Таким образом, я имею
Private Sub btnMemo_Click(ByVal Ctrl As Microsoft.Office.Core.CommandBarButton, ByRef CancelDefault As Boolean) Handles btnMemo.Click
DocMemo()
End Sub
в ThisAddin и затем
Friend Sub DocMemo()
OpenDocByNumber("Prec", 8862, 1)
End Sub
в моем новом файле EntryPoints.
Я добавляю новый файл AddInUtilities, который имеет
Открытый интерфейс IAddInUtilities
#If DEBUG Then
Sub DocMemo()
#End If
End Interface
Public Class AddInUtilities
Implements IAddInUtilities
Private Addin as ThisAddIn
#If DEBUG Then
Public Sub DocMemo() Implements IAddInUtilities.DocMemo
Addin.DocMemo()
End Sub
#End If
Friend Sub New(ByRef theAddin as ThisAddIn)
Addin=theAddin
End Sub
End Class
Я перехожу к файлу ThisAddIn и включаю
Частные утилиты As AddInUtilities
Защищенные утилиты Is Nothing Then утилит Overrides Function RequestComAddInAutomationService () As Object If = Конечная функция утилит New AddInUtilities (Me) End If Return
И теперь возможно протестировать DocMemo () функция в EntryPoints с помощью NUnit, чего-то вроде этого:
<TestFixture()> Public Class Numbering
Private appWord As Word.Application
Private objMacros As Object
<TestFixtureSetUp()> Public Sub LaunchWord()
appWord = New Word.Application
appWord.Visible = True
Dim AddIn As COMAddIn = Nothing
Dim AddInUtilities As IAddInUtilities
For Each tempAddin As COMAddIn In appWord.COMAddIns
If tempAddin.Description = "CobbettsMacrosVsto" Then
AddIn = tempAddin
End If
Next
AddInUtilities = AddIn.Object
objMacros = AddInUtilities.TestObject
End Sub
<Test()> Public Sub DocMemo()
objMacros.DocMemo()
End Sub
<TestFixtureTearDown()> Public Sub TearDown()
appWord.Quit(False)
End Sub
End Class
Единственной вещью Вы не можете затем модульный тест, являются фактические события Click, потому что Вы звоните в EntryPoints по-другому, т.е. через интерфейс RequestComAddInAutomationService, а не через обработчики событий.
Но это работает!
Считайте различные платформы насмешки NMock, RhinoMocks, и т.д. для фальсифицирования поведения Office в тестах.