3

첫 번째 Q.이 파일을 파일의 다른 위치로 이동시키는 작업 코드가 있습니다. 이는 문제가 아닙니다. 문제는 이동할 수있는 방사형 그라디언트를 만드는 방법입니다 (API 16 이하). 스나크를 선점"구름"이동 - 손가락으로 움직이는 방사형 그라디언트

, 나는 여기에 많은 시간을 소비했습니다

GradientDrawable (아래)도 비를 설정하지 않고 색상을 설정하는 방법이있을 것 같지 않습니다와 http://developer.android.com/reference/android/graphics/drawable/GradientDrawable.html

- 방사 방향.

public class CustomView extends View { 
    int width = (sWidth/8); // sWidth defined elsewhere as width of screen 
    int height = (sWidth/8); 
    GradientDrawable gradient; 
    int[] colors = {0x60ffffff,0x000000}; 

    public CustomView(Context context) { 
     super(context); 
     gradient = new GradientDrawable(GradientDrawable.Orientation.BL_TR,colors); 
    } 

    protected void onDraw(Canvas canvas) { 
     if(x != 0 && y != 0){ // OnTouch calls invalidate on this view for movement 
      gradient.mutate(); 
      gradient.setShape(GradientDrawable.RADIAL_GRADIENT); 
     // This just makes it disappear: 
     // setGradientType (GradientDrawable.RADIAL_GRADIENT); 
      gradient.setBounds(x-width/2, y-height/2, x + width, y + height); 
      gradient.draw(canvas); 
     } 
    } 
} 

이있다 :

http://developer.android.com/reference/android/graphics/RadialGradient.html

을하지만 그 기울기를 이동 할 수있는 방법은없는 것 같다. 방사형 그래디언트를 움직일 수있는 투명 원에 놓을 수 있습니까? 나는 잃어 버렸다. 미리 감사드립니다.

답변

2

편집 :

1 단계, 당신의 당김 폴더에 타원형 모양을 정의합니다. 이 하나는 "cloud.xml"입니다.

<?xml version="1.0" encoding="utf-8"?> 
<shape xmlns:android="http://schemas.android.com/apk/res/android" 
android:shape="oval" > 

<gradient 
    android:centerX="0.5" 
    android:centerY="0.5" 
    android:endColor="#00000000" 
    android:gradientRadius="30" 
    android:startColor="#f0ffffff" 
    android:type="radial" /> 
<size 
    android:width="60dp" 
    android:height="60dp" /> 
</shape> 

반경, 너비 및 높이는 동적으로 변경해야 할 수 있습니다. 그래서 무엇이든 넣으십시오. 위의 색 구성표는 완전히 투명하게 약간 투명한 색을 제공합니다. 구름 효과입니다.

2 단계, 사용자 정의보기의 생성자 :

// actually before the constructor this, of course: 
GradientDrawable circle; 

// now the constructor: 

circle = (GradientDrawable) context.getResources().getDrawable(R.drawable.cloud); 

단계 3의 onDraw 방법 :

  // x & y being coordinates updated from onTouch method, 
      // circleRad being some constant dependent on screen dp 
      if(x != 0 && y != 0){ 
      circle.setGradientRadius(circleRad); 
      circle.setBounds(x-circleRad, y-circleRad, 
        x+circleRad, y+circleRad); 
      circle.draw(canvas); 
     } 

------------- 원본, 적은 공정 효율의 솔루션을 아래에 보존 -----------

몇 주를 기다려 자신의 질문에 답할 수 있습니다. RadialGradient였습니다.

public class CustomView extends View implements OnTouchListener { 
    Shader radialGradientShader; 
    Paint paint; 
    private int circleDiam; 
    private int x = 0; 
    private int y = 0; 
    private int lastScreenColor; 

    public CustomView(Context context, int circleDiam) { 
     super(context); 
     this.circleDiam = circleDiam; 
     paint = new Paint(); 
    } 

    protected void onDraw(Canvas canvas) { 
     if(x != 0 && y != 0){  
      paint.setStyle(Paint.Style.FILL); 
      paint.setAntiAlias(true); 
      radialGradientShader = new 
    RadialGradient(x, y, circleDiam, 
    0xf0ffffff,0x00000000,Shader.TileMode.MIRROR); 
      paint.setShader(radialGradientShader); 
      canvas.drawCircle(x, y, circleDiam, paint); 
     } 
    } 

    public boolean onTouch(View v, MotionEvent event) { 
     x = (int)event.getX(); 
     y = (int)event.getY(); 

     if(event.getAction() == MotionEvent.ACTION_DOWN 
    && event.getAction() == MotionEvent.ACTION_MOVE){ 
      invalidate(); 
      return true; 
     } 
     else{ 
      x = 0; 
      y = 0; 
      invalidate(); 
      return false; 
     } 
    } 
} 

솜털 구름!

이 솔루션의 유일한 문제점은 onDraw 메소드에서 오브젝트를 인스턴스화 할 때 Eclipse가 화를 낼 수 있다는 것입니다. 그러나 생성자에서 인스턴스를 만들려고하면 추악 해집니다.

상기 문제점을 피하는 해결책을위한 추가 포인트.

+0

여기 보이는 것처럼 https://play.google.com/store/apps/details?id=com.anthropomo.digitalrattle (무료) – anthropomo