0

I have set list border using trigger according to my requirement but when I scroll up the listview and selected view cell is gone than I scroll down when ViewCell is appearing on screen than selected border is gone

To prevent this I also created frame renderer but still ViewCell border gone. Attached image here

class FrameHighLightRenderer : VisualElementRenderer<Frame>
{
    ACanvas _canvas = null;
    private FrameDrawable _frameDrawable;
    protected override void OnElementChanged(ElementChangedEventArgs<Frame> e)
    {
        base.OnElementChanged(e);

        if (e.NewElement != null)
        {
            if (_frameDrawable != null && e.NewElement.ClassId != null)       //This block execute while any cell appearing in scroll time up/dowm
            {                                                                 // I added classId =10 to identify colored/selected cell 

                if (e.NewElement.ClassId=="10")
                {

                     e.NewElement.OutlineColor = Xamarin.Forms.Color.Red;
                     this.Invalidate();
                                     }
                else
                {
                    e.NewElement.BackgroundColor = Xamarin.Forms.Color.TransParent;
                }

            }
            else
            {

                UpdateBackground();
            }
        }
    }

    void UpdateBackground()
    {
        _frameDrawable = new FrameDrawable(Element, Context.ToPixels);
        this.SetBackground(_frameDrawable);

    }

    class FrameDrawable : Drawable
    {
        readonly Frame _frame;
        readonly Func<double, float> _convertToPixels;
        public ACanvas _canvas;
        bool _isDisposed;
        Bitmap _normalBitmap;

        public FrameDrawable(Frame frame, Func<double, float> convertToPixels)
        {
            _frame = frame;
            _convertToPixels = convertToPixels;
            frame.PropertyChanged += FrameOnPropertyChanged;
        }

        public override bool IsStateful
        {
            get { return false; }
        }

        public override int Opacity
        {
            get { return 0; }
        }


        public override void Draw(ACanvas canvas)
        {
            SetBorderColorandWidth(canvas);
        }

        private void SetBorderColorandWidth(ACanvas canvas)
        {
            int width = Bounds.Width();
            int height = Bounds.Height();
            if (width <= 0 || height <= 0)
            {
                if (_normalBitmap != null)
                {
                    _normalBitmap.Dispose();
                    _normalBitmap = null;
                }
                return;
            }

            if (_normalBitmap == null || _normalBitmap.Height != height || _normalBitmap.Width != width)
            {

                _normalBitmap = CreateBitmap(false, width, height);
            }
            Bitmap bitmap = _normalBitmap;

            // if(canvas)
            if (InspectionQAPage._highlight_color)
            {
                using (var paint = new Paint { AntiAlias = true })
                using (var path = new Path())
                using (Path.Direction direction = Path.Direction.Cw)
                using (Paint.Style style = Paint.Style.Stroke)
                using (var rect = new RectF(0, 0, width, height))
                {
                    float rx = Forms.Context.ToPixels(4);
                    float ry = Forms.Context.ToPixels(4);
                    path.AddRoundRect(rect, rx, ry, direction);
                    if (this._frame.OutlineColor == Xamarin.Forms.Color.Red)
                    {   
                        paint.Color = Android.Graphics.Color.Red;
                        this._frame.ClassId = "10";
                        // this._frame.BackgroundColor = Xamarin.Forms.Color.Red;
                        // paint.SetStyle = (Paint.Style)(Resource.Style.WithBorder);
                    }
                    else
                    {
                       // paint.Reset();
                       paint.Color = Android.Graphics.Color.Transparent;
                       // this._frame.BackgroundColor = Xamarin.Forms.Color.Transparent;
                    }

                    paint.StrokeWidth = 10f;  //set outline stroke
                    paint.SetStyle(style);
                    canvas.DrawPath(path, paint);

                }
                InspectionQAPage._highlight_color = false;
            }
            else
            {
                using (var paint = new Paint())
                    canvas.DrawBitmap(bitmap, 0, 0, paint);
            }
           // InvalidateSelf();

        }
        public override void SetAlpha(int alpha)
        {
        }

        public override void SetColorFilter(ColorFilter cf)
        {
        }

        protected override void Dispose(bool disposing)
        {
            if (disposing && !_isDisposed)
            {
                if (_normalBitmap != null)
                {
                    _normalBitmap.Dispose();
                    _normalBitmap = null;
                }

                _isDisposed = true;
            }

            base.Dispose(disposing);
        }

        protected override bool OnStateChange(int[] state)
        {
            return false;
        }

        Bitmap CreateBitmap(bool pressed, int width, int height)
        {
            Bitmap bitmap;
            using (Bitmap.Config config = Bitmap.Config.Argb8888)
                if (width <= 0 || height <= 0)
                {
                    return null;
                }
                else
                    bitmap = Bitmap.CreateBitmap(width, height, config);

            using (var canvas = new ACanvas(bitmap))
            {
               // DrawCanvas(canvas, width, height, pressed);
            }

            return bitmap;
        }


        void FrameOnPropertyChanged(object sender, PropertyChangedEventArgs e)
        {
            if (e.PropertyName == VisualElement.BackgroundColorProperty.PropertyName ||
                e.PropertyName == Frame.OutlineColorProperty.PropertyName ||
                e.PropertyName == Frame.CornerRadiusProperty.PropertyName)
            {
                try
                {
                    if (_normalBitmap == null)
                        return;

                    int width = Bounds.Width();
                    int height = Bounds.Height();

                    if (width <= 0 || height <= 0)
                    {
                        return;
                    }

                    if (_canvas == null)
                    {
                        var canvas = new ACanvas(_normalBitmap);
                            _canvas = canvas;
                            _canvas.DrawColor(global::Android.Graphics.Color.Red, PorterDuff.Mode.Clear);
                            DrawCanvas(_canvas, width, height, false, sender);
                    }
                    else
                    {
                        _canvas.DrawColor(global::Android.Graphics.Color.Red, PorterDuff.Mode.Clear);
                        DrawCanvas(_canvas, width, height, false, sender);
                    }

                       InvalidateSelf();

                }
                catch (Exception ex)
                {

                    Console.WriteLine(">>>>>>>>>>>>>>>>>>>>>>>>>>" + ex);
                    throw;
                }
            }
        }


        public void DrawCanvas(ACanvas canvas, int width, int height, bool pressed, object sender)
        {
              using (var paint = new Paint { AntiAlias = true })
                using (var path = new Path())
                using (Path.Direction direction = Path.Direction.Cw)
                using (Paint.Style style = Paint.Style.Stroke)
                using (var rect = new RectF(0, 0, width, height))
                {
                    float rx = Forms.Context.ToPixels(4);
                    float ry = Forms.Context.ToPixels(4);
                    path.AddRoundRect(rect, rx, ry, direction);

                    if (((Frame)sender).OutlineColor == Xamarin.Forms.Color.Red)
                    {
                        paint.Color = Android.Graphics.Color.Red;

                        ((Frame)sender).ClassId = "10";

                    }
                    else
                    {

                    ((Frame)sender).BackgroundColor = Xamarin.Forms.Color.Transparent;


                }
                    paint.StrokeWidth = 10f;  //set outline stroke
                    paint.SetStyle(style);
                    canvas.DrawPath(path, paint);


                }
            }

    }


}

}

0 Answers0