我试图将一些Java代码移植到C#中。其中CW是一个扩展视图的类。 OnSelectedListener
是一个以Cselected
为接口的接口,它接受int
参数。
setListener是类中的一个方法。问题在于实例化Java中的接口。
private View selectedView = new View( context );
CW.setListener( new OnSelectedListener() {
@Override
public void cSelected(Integer color) {
selectedColor = color;
selectedView.setBackgroundColor( color );
}
});
同一方法中的另一个实现
VS.setListener( new OnSelectedListener() {
public void cSelected(Integer color) {
VS.setColor( color, true );
}
} );
有人可以帮我把上面的代码移植到C#吗?任何帮助表示赞赏。我正在使用Xamarin开发Android应用程序。
编辑:
这是完整的CW类
public class HSVColorWheel : View
{
private const float SCALE = 2f;
private const float FADE_OUT_FRACTION = 0.03f;
private const int POINTER_LINE_WIDTH_DP = 2;
private const int POINTER_LENGTH_DP = 10;
private Context _context;
public HSVColorWheel(Context context, IAttributeSet attrs, int defStyle)
: base(context, attrs, defStyle)
{
this._context = context;
Init();
}
public HSVColorWheel(Context context, IAttributeSet attrs) : base(context, attrs)
{
this._context = context;
Init();
}
public HSVColorWheel(Context context) : base(context)
{
this._context = context;
Init();
}
private int scale;
private int pointerLength;
private int innerPadding;
private Paint pointerPaint = new Paint();
private void Init()
{
float density = _context.Resources.DisplayMetrics.Density;
scale = (int) (density*SCALE);
pointerLength = (int) (density*POINTER_LENGTH_DP);
pointerPaint.StrokeWidth = (int) (density*POINTER_LINE_WIDTH_DP);
innerPadding = pointerLength/2;
}
public void setListener(OnSelectedListener listener)
{
_listener = listener;
}
private float[] colorHsv = {0f, 0f, 1f};
public void setColor(Color color)
{
Color.ColorToHSV(color, colorHsv);
Invalidate();
}
}
接口:
public interface OnSelectedListener {
void cSelected( Integer color );
}
答案 0 :(得分:2)
正如评论中所提到的,由于C#具有language-level support for events,因此它提供了比java"甚至是听众更清晰的方法。方法
因此,所有基于侦听器的java代码都应该在C#中转换为适当的事件。
在这种情况下,您似乎提出了一个int
参数的事件。这在C#中声明如下:
//In the CW class:
public event EventHandler<int> SelectionChanged;
然后通过&#34;事件调用器&#34;引发,如下所示:
//In the CW class:
public void OnSelectionChanged()
{
var handler = SelectionChanged;
if (handler != null)
handler(this, //[ some int value here ]);
}
来自&#34;消费者&#34;或&#34;听众&#34;你只需处理这个事件:
//In an Activity
var CW = new CW(this);
CW.SelectionChanged += CW_SelectionChanged;
其中CW_SelectionChanged
可以是匿名方法,实际命名方法,甚至是lambda表达式:
CW.SelectionChanged += (sender, intValue) => //[here you do something with intValue]
// -- OR --
CW.SelectionChanged += this.CW_SelectionChanged;
// then
private void CW_SelectionChanged(object sender, int intValue)
{
//[here you do something with intValue]
}
这样,您就不需要声明额外的,不需要的1方法接口。