2012-01-21 8 views
1

私はカスタムDrawableオブジェクトを作成する必要があります。私はこのカスタムドロアブルに、例えばビューのバックグラウンドとして適用されるグラデーションを表示します。これを行うには、Drawableクラスのdrawメソッドをオーバーライドします。私CustomDrawableクラスのコードは次のようになります。私はのonCreateメソッドの私のウィンドウの背景として、この描画可能に割り当てるときプログラムで作成されたAndroid Drawableオブジェクトはuggly(スケーリング)です

public void draw(Canvas canvas) { 
    Rect clipBounds = canvas.getClipBounds(); 
    Paint rectanglePaint = new Paint(); 

    LinearGradient lg = new LinearGradient(0,0,0,clipBounds.height(),0xff838383,0xff242424,Shader.TileMode.CLAMP); 
    rectanglePaint.setShader(lg); 

    RectF rectangle = new RectF(0f,0.0f, clipBounds.width(), clipBounds.height()); //in pixels 
    canvas.drawRoundRect(rectangle, 0f, 0f, rectanglePaint); 
} 

問題が表示されます。グラデーションは問題なく表示されますが、スケーリングされているように見えますが、実際には醜いようです。

奇妙なことは純粋にXMLで同等の描画可能なものを作成していて、これをレイアウトXMLの背景として直接割り当てます。この醜い縮尺の効果はありません(私はちょうどこの次の行 "window.setFormat(PixelFormat .RGBA_8888); ")

私はこれをプログラムで行うと同じ結果にならないのはなぜですか?

すべてのアイデアは本当に感謝しています! ありがとう;)

+0

お試しいただけますか:ペイントrectanglePaint =新しいペイント(Paint.ANTI_ALIAS_FLAG); – Lumis

+0

私は試しましたが、結果は残念なことに同じです... – ayorosmage

+0

なぜ、私はちょうど推測しています...理論の1つの理由は、drawableのキャンバスのサイズが実際のそれを使用するビュー。 – Lumis

答えて

0

私は、自分のプロジェクトで何度も同じ問題に遭遇しましたが、時間が足りず(そして怠惰なので)、最適ではない解決策に満足しています。しかし、最近私は、この特定の問題を解決するためにいくつかの時間を見つけました。ここに私の解決策があり、それがあなたにも役立つことを願っています。

Bitmap scaleDownLargeImageWithAspectRatio(Bitmap image) 
      { 
       int imaheVerticalAspectRatio,imageHorizontalAspectRatio; 
       float bestFitScalingFactor=0; 
       float percesionValue=(float) 0.2; 

       //getAspect Ratio of Image 
       int imageHeight=(int) (Math.ceil((double) image.getHeight()/100)*100); 
       int imageWidth=(int) (Math.ceil((double) image.getWidth()/100)*100); 
       int GCD=BigInteger.valueOf(imageHeight).gcd(BigInteger.valueOf(imageWidth)).intValue(); 
       imaheVerticalAspectRatio=imageHeight/GCD; 
       imageHorizontalAspectRatio=imageWidth/GCD; 
       Log.i("scaleDownLargeImageWIthAspectRatio","Image Dimensions(W:H): "+imageWidth+":"+imageHeight); 
       Log.i("scaleDownLargeImageWIthAspectRatio","Image AspectRatio(W:H): "+imageHorizontalAspectRatio+":"+imaheVerticalAspectRatio); 

       //getContainer Dimensions 
       int displayWidth = getWindowManager().getDefaultDisplay().getWidth(); 
       int displayHeight = getWindowManager().getDefaultDisplay().getHeight(); 
       //I wanted to show the image to fit the entire device, as a best case. So my ccontainer dimensions were displayWidth & displayHeight. For your case, you will need to fetch container dimensions at run time or you can pass static values to these two parameters 

       int leftMargin = 0; 
       int rightMargin = 0; 
       int topMargin = 0; 
       int bottomMargin = 0; 
       int containerWidth = displayWidth - (leftMargin + rightMargin); 
       int containerHeight = displayHeight - (topMargin + bottomMargin); 
       Log.i("scaleDownLargeImageWIthAspectRatio","Container dimensions(W:H): "+containerWidth+":"+containerHeight); 

       //iterate to get bestFitScaleFactor per constraints 
       while((imageHorizontalAspectRatio*bestFitScalingFactor <= containerWidth) && 
         (imaheVerticalAspectRatio*bestFitScalingFactor<= containerHeight)) 
       { 
        bestFitScalingFactor+=percesionValue; 
       } 

       //return bestFit bitmap 
       int bestFitHeight=(int) (imaheVerticalAspectRatio*bestFitScalingFactor); 
       int bestFitWidth=(int) (imageHorizontalAspectRatio*bestFitScalingFactor); 
       Log.i("scaleDownLargeImageWIthAspectRatio","bestFitScalingFactor: "+bestFitScalingFactor); 
       Log.i("scaleDownLargeImageWIthAspectRatio","bestFitOutPutDimesions(W:H): "+bestFitWidth+":"+bestFitHeight); 
       image=Bitmap.createScaledBitmap(image, bestFitWidth,bestFitHeight, true); 

       //Position the bitmap centre of the container 
       int leftPadding=(containerWidth-image.getWidth())/2; 
       int topPadding=(containerHeight-image.getHeight())/2; 
       Bitmap backDrop=Bitmap.createBitmap(containerWidth, containerHeight, Bitmap.Config.RGB_565); 
       Canvas can = new Canvas(backDrop); 
       can.drawBitmap(image, leftPadding, topPadding, null); 

       return backDrop; 
      } 
関連する問題