Я выполнил Custom ImageView:
public class RoundRectCornerImageView extends ImageView {
private float radius = 18.0f;
private Path path;
private RectF rect;
public RoundRectCornerImageView(Context context) {
super(context);
init();
}
public RoundRectCornerImageView(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
public RoundRectCornerImageView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init();
}
private void init() {
path = new Path();
}
@Override
protected void onDraw(Canvas canvas) {
rect = new RectF(0, 0, this.getWidth(), this.getHeight());
path.addRoundRect(rect, radius, radius, Path.Direction.CW);
canvas.clipPath(path);
super.onDraw(canvas);
}
}
Как использовать:
Выход:
Надеюсь, это вам поможет.
Я предложил бы статью Jeff Atwood об Удобной для пользователя Обработке исключений, которая делает большую часть того, что Вы уже спрашиваете (Информация о приложении, Снимок экрана, Детали Исключения, ОС, Регистрируясь к текстовым файлам и Посылая по электронной почте), и содержит исходный код, таким образом, Вы добавляете дополнительный материал, в котором Вы нуждаетесь.
Можно присоединить к событию необработанного исключения и зарегистрировать его веб-сервис/и т.д.
[STAThread]
static void Main()
{
Application.ThreadException += new ThreadExceptionEventHandler(OnUnhandledException);
Application.Run(new FormStartUp());
}
static void OnUnhandledException(object sender, ThreadExceptionEventArgs t)
{
// Log
}
Я также нашел это использование фрагмента кода AppDomain вместо ThreadException:
static class EntryPoint {
[MTAThread]
static void Main() {
// Add Global Exception Handler
AppDomain.CurrentDomain.UnhandledException +=
new UnhandledExceptionEventHandler(OnUnhandledException);
Application.Run(new Form1());
}
// In CF case only, ALL unhandled exceptions come here
private static void OnUnhandledException(Object sender,
UnhandledExceptionEventArgs e) {
Exception ex = e.ExceptionObject as Exception;
if (ex != null) {
// Can't imagine e.IsTerminating ever being false
// or e.ExceptionObject not being an Exception
SomeClass.SomeStaticHandlingMethod(ex, e.IsTerminating);
}
}
}
Вот некоторая документация относительно него: Необработанное исключение AppDomain
За пределами просто обработки его самостоятельно, нет действительно универсального способа сделать это, которое является допускающим повторное использование, это действительно должно быть интегрировано с интерфейсом приложения правильно, но Вы могли установить веб-сервис, который берет имя приложения, исключение и весь этот хороший материал, и имейте централизованную точку для всех своих приложений.
Можно хотеть изучить функцию сообщения об ошибке, встроенную в Читателя JetBrain Omea. Это имеет всеобъемлющий компонент обработки ошибок, который выталкивает диалоговое окно, когда неожиданная ошибка происходит. Пользователь может ввести больше деталей прежде, чем отправить проблему общедоступному веб-сервису ошибочного набора JetBrain.
Они сделали открытый исходный код Omea, чтобы позволить сообществу обновлять.NET 1,1 кодовых базы до v2 или 3. http://www.jetbrains.net/confluence/display/OMEA/this+link