2012-12-13 26 views
11

धुंधले बिना स्केल मैंने एक मूल एनीमेशन रखा है जिसमें एक नियंत्रण स्केलिंग 0.1 से 1.0 (x y) है। जो समस्या मैं देख रहा हूं वह अंतिम स्थिर स्थिति पर बसने से पहले कहा गया नियंत्रणों का यह "धुंधला" है।WinRT (सी #/एक्सएएमएल)

एक उदाहरण यह स्क्रीन कैमरा मैंने लिया है।

Watch Screen Cam

मुझे यकीन है कि यह क्या पैदा नहीं कर रहा हूँ। यह एक डिफ़ॉल्ट एनीमेशन/स्टोरीबोर्ड है जिसे आप ब्लेंड के माध्यम से उत्पन्न करेंगे।

<DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.RenderTransform).(CompositeTransform.ScaleX)" Storyboard.TargetName="UIBorder" > 
      <EasingDoubleKeyFrame KeyTime="0" Value="0.2"> 
       <EasingDoubleKeyFrame.EasingFunction> 
        <BackEase EasingMode="EaseInOut"/> 
       </EasingDoubleKeyFrame.EasingFunction> 
      </EasingDoubleKeyFrame> 
      <EasingDoubleKeyFrame KeyTime="0:0:1.4" Value="1"> 
       <EasingDoubleKeyFrame.EasingFunction> 
        <BackEase EasingMode="EaseInOut" Amplitude="3"/> 
       </EasingDoubleKeyFrame.EasingFunction> 
      </EasingDoubleKeyFrame> 
     </DoubleAnimationUsingKeyFrames> 

उक्त नियंत्रण:

<Grid x:Name="UIBorder" Width="555" HorizontalAlignment="Center" VerticalAlignment="Center" RenderTransformOrigin="0.5,0.5"> 
      <Grid.RenderTransform> 
       <CompositeTransform ScaleY="0.2" ScaleX="0.2"/> 
      </Grid.RenderTransform> 

      <Grid Margin="122,0,0,0" RenderTransformOrigin="0.5,0.5" > 
       <Border Background="#FF343434" ManipulationMode="None" IsDoubleTapEnabled="False" IsHoldingEnabled="False" IsRightTapEnabled="False" IsTapEnabled="False" RenderTransformOrigin="0.5,0.5" > 
        <Border.RenderTransform> 
         <CompositeTransform/> 
        </Border.RenderTransform> 
       </Border> 
      </Grid> 
      <Image HorizontalAlignment="Left" VerticalAlignment="Center" Source="ms-appx:///Assets/Chrome/LoginSeal.png" Stretch="None"/> 
     </Grid> 

नोट:

  • मैं इस दोनों एक Windows 8 पीसी पर इस बात की पुष्टि और सतही आरटी टैबलेट दो स्वतंत्र स्रोतों से (धुंधला लिया है यानी हार्डवेयर विशिष्ट नहीं)।
  • मैंने बिटमैप कैश को यह देखने के लिए कोशिश की है कि इसमें कोई बदलाव आया है (जैसा भी होगा)।
+0

हम्म। मुझे नहीं लगता कि आप इसे पूरी तरह से खत्म करने में सक्षम होने जा रहे हैं। स्केलिंग शायद सटीक रूप से जल्दी से किया जा रहा है और इसलिए धुंधला होने वाली "गोलियां" त्रुटियां हो सकती हैं। – ChrisF

+0

नकारात्मक। मैंने एनिमेशन को धीमा एनीमेशन की अनुमति देने के लिए धीमा कर दिया है और वे बदतर हो जाते हैं। तेजी से कम से कम धुंधला छुपाता है। (क्षमा करें) –

+0

मैंने बिल्कुल वही कोड इस्तेमाल किया और मैंने स्टोरीबोर्ड अवधि बढ़ा दी, लेकिन मुझे कोई धुंधली सीमा नहीं दिखाई दे रही थी? आश्चर्य है कि मुझे क्या याद आया? –

उत्तर

1

सेट UseLayoutRounding = "सही" UIBorder

+0

कोशिश की कि कुछ भी नहीं :( –

+0

स्नैप्सटॉडेविस पिक्सल = "ट्रू" –

6

के लिए एक बग की तरह लगता है। स्पष्ट रूप से WinRT स्वचालित रूप से एनिमेशन के दौरान कैशमोड को बिटमैप कैश में बदल रहा है और यह ऑब्जेक्ट को निम्न स्तर पर कैश करता है। जबकि मैं अब जो कुछ भी देख रहा हूं उसे पुन: उत्पन्न नहीं कर सका, जबकि टेक्स्टबॉक्स के प्रक्षेपण गुणों को एनिमेट करते समय मुझे विंडोज 8 के प्रीरलीज़ संस्करणों में से एक में एक ही समस्या थी। मुझे लगता है कि संभवतः क्या होता है यह एनीमेशन शुरू करने से पहले आपके नियंत्रण के उच्चतम आकार का उपयोग करता है जो कि बिटमैप कैश के लिए उपयोग किए जाने वाले रेंडरएटस्केल प्रॉपर्टी वैल्यू का निर्धारण करने के लिए किया जाता है (जो कि WinRT में उपलब्ध नहीं है, लेकिन सिल्वरलाइट या डब्ल्यूपीएफ में मौजूद है और यह इसके संस्करण की तरह लगता है WinRT में मौजूद है, यह सिर्फ एपीआई के उपयोगकर्ताओं के संपर्क में नहीं है)। तब एक वर्कअराउंड किसी भी तरह से अदृश्य रूप से आपके बिटमैप के स्केलएक्स/स्केलवाई मानों को 1 तक लोड कर सकता है और फिर बिटमैप पहले दिखाई देने से पहले 0.2 पर वापस आ सकता है। वैकल्पिक रूप से आप नियंत्रण की अस्पष्टता 0 पर सेट कर सकते हैं और एनीमेशन शुरू होने से पहले 1 तक स्केल कर सकते हैं, फिर पैमाने को एनिमेट करने के बाद नियंत्रण में फीका हो सकता है। यदि आपको वास्तव में एनीमेशन से पहले दिखाने के लिए छोटे से की आवश्यकता है - आपके पास नियंत्रण की दो प्रतियां हो सकती हैं - एक छोटा सा जो एनीमेशन की शुरुआत के बाद ठीक से गायब हो जाता है और दूसरा जो बड़ा लेकिन अदृश्य (या ओपेसिटी = "0.005" पर शुरू होता है)) और एनीमेशन शुरू होने पर ओपेसिटी 1, स्केल 0.2 को बहुत जल्दी एनिमेट करता है।

यह मेरे लिए ठीक लग रहा था:

<Page 
    x:Class="App76.MainPage" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:local="using:App76" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    mc:Ignorable="d"> 
    <Page.Resources> 
     <Storyboard 
      x:Name="anim" 
      SpeedRatio="0.2"> 
      <DoubleAnimationUsingKeyFrames 
       Storyboard.TargetProperty="(UIElement.RenderTransform).(CompositeTransform.ScaleX)" 
       Storyboard.TargetName="UIBorder"> 
       <EasingDoubleKeyFrame 
        KeyTime="0" 
        Value="0.2"> 
        <EasingDoubleKeyFrame.EasingFunction> 
         <BackEase 
          EasingMode="EaseInOut" /> 
        </EasingDoubleKeyFrame.EasingFunction> 
       </EasingDoubleKeyFrame> 
       <EasingDoubleKeyFrame 
        KeyTime="0:0:1.4" 
        Value="1"> 
        <EasingDoubleKeyFrame.EasingFunction> 
         <BackEase 
          EasingMode="EaseInOut" 
          Amplitude="3" /> 
        </EasingDoubleKeyFrame.EasingFunction> 
       </EasingDoubleKeyFrame> 
      </DoubleAnimationUsingKeyFrames> 
      <DoubleAnimationUsingKeyFrames 
       Storyboard.TargetProperty="(UIElement.RenderTransform).(CompositeTransform.ScaleY)" 
       Storyboard.TargetName="UIBorder"> 
       <EasingDoubleKeyFrame 
        KeyTime="0" 
        Value="0.2"> 
        <EasingDoubleKeyFrame.EasingFunction> 
         <BackEase 
          EasingMode="EaseInOut" /> 
        </EasingDoubleKeyFrame.EasingFunction> 
       </EasingDoubleKeyFrame> 
       <EasingDoubleKeyFrame 
        KeyTime="0:0:1.4" 
        Value="1"> 
        <EasingDoubleKeyFrame.EasingFunction> 
         <BackEase 
          EasingMode="EaseInOut" 
          Amplitude="3" /> 
        </EasingDoubleKeyFrame.EasingFunction> 
       </EasingDoubleKeyFrame> 
      </DoubleAnimationUsingKeyFrames> 

     </Storyboard> 
    </Page.Resources> 
    <Grid 
     Background="{StaticResource ApplicationPageBackgroundThemeBrush}"> 
     <Grid 
      x:Name="UIBorder" 
      Width="555" 
      HorizontalAlignment="Center" 
      VerticalAlignment="Center" 
      RenderTransformOrigin="0.5,0.5"> 
      <!--<Grid.CacheMode> 
       <BitmapCache 
        /> 
      </Grid.CacheMode>--> 
      <Grid.RenderTransform> 
       <CompositeTransform 
        x:Name="ct" 
        ScaleY="0.2" 
        ScaleX="0.2" /> 
      </Grid.RenderTransform> 

      <Grid 
       Margin="122,0,0,0" 
       RenderTransformOrigin="0.5,0.5"> 
       <Border 
        Background="#FF343434" 
        ManipulationMode="None" 
        IsDoubleTapEnabled="False" 
        IsHoldingEnabled="False" 
        IsRightTapEnabled="False" 
        IsTapEnabled="False" 
        RenderTransformOrigin="0.5,0.5"> 
        <Border.RenderTransform> 
         <CompositeTransform /> 
        </Border.RenderTransform> 
       </Border> 
      </Grid> 
      <Image 
       HorizontalAlignment="Left" 
       VerticalAlignment="Center" 
       Source="ms-appx:///Assets/SplashScreen.png" 
       Stretch="None" /> 
     </Grid> 
     <Button 
      VerticalAlignment="Bottom" 
      HorizontalAlignment="Left" 
      Content="TEST" 
      Click="ButtonBase_OnClick" /> 
    </Grid> 
</Page> 

using Windows.UI.Xaml; 
using Windows.UI.Xaml.Controls; 

namespace App76 
{ 
    public sealed partial class MainPage : Page 
    { 
     public MainPage() 
     { 
      this.InitializeComponent(); 
      ct.ScaleX = 1; 
      ct.ScaleY = 1; 
      this.Loaded += MainPage_Loaded; 
     } 

     void MainPage_Loaded(object sender, RoutedEventArgs e) 
     { 
      ct.ScaleX = 0.2; 
      ct.ScaleY = 0.2; 
     } 

     private void ButtonBase_OnClick(object sender, RoutedEventArgs e) 
     { 
      anim.Begin(); 
     } 
    } 
} 
+0

दृश्यता चाल के साथ इसे आजमाएं। धन्यवाद बहुत कुछ :) –