Visualizzazione dei risultati da 1 a 2 su 2
  1. #1

    [WP] Creazioni dinamica più rettangoli

    Ciao a tutti,

    sono un novizio nella programmazione complessa, ma con buona volontà. Sto cercando di creare un'applicazione per windows phone. Prima di tutto sono dell'idea che tutto il codice di cui ho bisogno esiste già da qualche parte su internet, ma al momento, dopo varie ricerche non ho trovato nulla che mi servisse.

    una parte della mia applicazione prevede il crop di una immagine selezionata dalla libreria delle foto o da una foto appena scattata. fin qui facile, ho trovato un samples che fa proprio questo.
    in base ad una selezione fatta con il touch visivamente viene creato un rettangolo che rappresenta il contorno dell'immagine finale (quella croppata) che successivamente viene storata.

    quello che vorrei fare io e ulteriore modifica a questo samples, ovvero la possibilità di creare più crop per una stessa immagine.

    l'idea è: disegno il rettagolo, confermo, schiatto un tasto di add e creo un altro rettangolo. infine farà tante immagini quanti sono i rettangoli (per semplicità diciamo che l'utente potrà creare al massimo due ulteriori immagini).

    ho provato e riprovato, ma evidentemente mi sfugge qualche cosa.


    per prima cosa ho creato due rettangoli in xaml del tipo

    codice:
     <Rectangle x:Name="rect" Visibility="Collapsed" 
    Stroke="Black" StrokeThickness="5" ></Rectangle>                 
    <Rectangle x:Name="rect2" Visibility="Collapsed" 
    Stroke="Black" StrokeThickness="5" ></Rectangle>
    in seguito ho usato due eventi per gestire la renderizzazione
    codice:
    AddHandler CompositionTarget.Rendering, AddressOf CompositionTarget_Rendering         
    AddHandler CompositionTarget.Rendering, AddressOf CompositionTarget_Rendering2
    dopodichè gestisco le coordinate con gli eventi del mouse
    codice:
    Private Sub CropImage_MouseLeftButtonDown(ByVal sender As Object, ByVal e As MouseButtonEventArgs)
       If cropping = False Then
          p1 = e.GetPosition(DisplayedImageElement)
          p2 = p1             
          rect.Visibility = Visibility.Visible             
         'rect2.Visibility = Visibility.Visible         
         Else
           p1 = e.GetPosition(DisplayedImageElement)
           p2 = p1            
           'rect.Visibility = Visibility.Visible             
           rect2.Visibility = Visibility.Visible         
      End If         
    cropping = True     
    End Sub
    dove le costanti dovrebbero essere indirizzarmi nella gestione di uno e l'altro rettangolo.

    le coordinate finali
    codice:
    Private Sub CropImage_MouseMove(ByVal sender As Object, ByVal e As MouseEventArgs)         
    p2 = e.GetPosition(DisplayedImageElement)     
    End Sub
    codice:
    Private Sub CropImage_MouseLeftButtonUp(ByVal sender As Object, ByVal e As MouseButtonEventArgs)         
    p2 = e.GetPosition(DisplayedImageElement)         
    cropping = False       
    End Sub
    infine il rendering dei rettangoli (la variazione di coordinate (+20) la spiego in seguito

    codice:
    Private Sub CompositionTarget_Rendering(ByVal sender As Object, ByVal e As EventArgs)         
    If cropping Then
         p3 = p1
         p4 = p2             
         rect.SetValue(canvas.LeftProperty, If(p3.X < p4.X, p3.X, p4.X))      
         rect.SetValue(canvas.TopProperty, If(p3.Y < p4.Y, p3.Y, p4.Y))  
         rect.Width = CInt(Fix(Math.Abs(p4.X - p3.X)))            
         rect.Height = CInt(Fix(Math.Abs(p4.Y - p3.Y)))             
         cropping2 = True        
    End If     
    End Sub      
    Private Sub CompositionTarget_Rendering2(ByVal sender As Object, ByVal e As EventArgs)         
    If cropping2 Then
         rect2.SetValue(canvas.LeftProperty, If(p1.X < p2.X, p1.X + 20, p2.X + 20))                
         rect2.SetValue(canvas.TopProperty, If(p1.Y < p2.Y, p1.Y + 20, p2.Y + 20))              
         rect2.Width = CInt(Fix(Math.Abs(p2.X - p1.X))) + 20             
         rect2.Height = CInt(Fix(Math.Abs(p2.Y - p1.Y))) + 20         
    End If     
    End Sub
    la variazione di coordinate le ho inserite per rendermi conto dell'effetto.

    il problemi sono due.
    1. mi vengono creati conteporaneamente due rettangoli (per questo il +20, altrimenti non avrei avuto visione)
    2. se provo a disegnare un ulteriore rettangolo i primi 2 (che dovrebbe essere uno solo) scompaiono.

    qualcuno mi può dare qualche dritta su come poter risolvere questo problema??

    grazie mille =)

  2. #2

    risolto!

    ciao a tutti, ho risolto aggiungendo un'altra variabile booleana. era molto più semplice del previsto, probabilmente mi sono incartato da solo =)

    codice:
    void CompositionTarget_Rendering(object sender, EventArgs e)         
    {             
      if (first)             
             {                 
               if (cropping)                 
                 { rect.SetValue(Canvas.LeftProperty, (p1.X < p2.X) ? p1.X : p2.X);                     
                    rect.SetValue(Canvas.TopProperty, (p1.Y < p2.Y) ? p1.Y : p2.Y);                     
                    rect.Width = (int)Math.Abs(p2.X - p1.X);                     
                    rect.Height = (int)Math.Abs(p2.Y - p1.Y);                     
                    cropped = true;
                   }                 
                if (cropped)                 
                { rect.SetValue(Canvas.LeftProperty, (p1.X < p2.X) ? p1.X : p2.X);
                  rect.SetValue(Canvas.TopProperty, (p1.Y < p2.Y) ? p1.Y : p2.Y);                                  }                  
                    }             
               }         
    }          
    
    void CompositionTarget_Rendering2(object sender, EventArgs e)         
      {             
          if (second)             
             {                
               if (cropping)                 
                   {                      
                      rect2.SetValue(Canvas.LeftProperty, (p1.X < p2.X) ? p1.X  : p2.X );                     
                      rect2.SetValue(Canvas.TopProperty, (p1.Y < p2.Y) ? p1.Y  : p2.Y );                     
                      rect2.Width = (int)Math.Abs(p2.X - p1.X );                     
                      rect2.Height = (int)Math.Abs(p2.Y - p1.Y );                 
                    }                 
              if (cropped)                 
                  {                     
                   rect2.SetValue(Canvas.LeftProperty, (p1.X < p2.X) ? p1.X : p2.X);                     
                   rect2.SetValue(Canvas.TopProperty, (p1.Y < p2.Y) ? p1.Y : p2.Y);                  
                   }             
             }         
    }
    ho inserito due variabili booleane (first, second) valorizzate a seconda se voglio disegnare il primo o il secondo rettangolo. funziona perfettamente

    NUOVO PROBLEMA.
    una terza variabile (cropped) la volevo utilizzare per modificare la posizione del rettangolo disegnato. con il codice che ho implementato riposiziono con il click. in realtà mi piacerebbe poterlo riposizionare con una funzione drag. qualche idea??? il massimo sarebbe anche avere la possibilità di poter ridimensionare e spostare l'immagine con una funzione tipo che combini il drag e il pinch (lo zoom fatto con le dita). naturalmente il tutto renderizzato in tempo reale, any ideas??

    grazie mille

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.