2015-09-28 65 views
0

好吧,我有一個活動,它被分成4片段和topMost片段我用畫布繪製三角形使用路徑。動畫片段中的畫布對象來自活動

在中間片段我有一個查看尋呼機,我正在尋找一種方法來從viewPager onPageScrolled()動畫三角形。 代碼

片段

public class LoginTopCanvas extends Fragment { 
private View topCanvasView; 
@Nullable 
@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    topCanvasView = new PagerCanvasTop(getActivity()); 
    return topCanvasView; 
} 

}

帆布

public class PagerCanvasTop extends View { 
private String TAG = "PagerCanvasTop"; 
Paint redPaint; 
Canvas canvas; 
public PagerCanvasTop(Context context) { 
    super(context); 
} 
@Override 
protected void onDraw(Canvas canvas) { 
    this.canvas = canvas; 
    canvas.drawColor(getResources().getColor(R.color.bb_red)); 

    Paint blackPaint = new Paint(); 
    blackPaint.setColor(getResources().getColor(R.color.bb_black)); 
    blackPaint.setAntiAlias(true); 

    redPaint = new Paint(); 
    redPaint.setColor(getResources().getColor(R.color.bb_red)); 
    redPaint.setAntiAlias(true); 
    redPaint.setStyle(Paint.Style.STROKE); 
    Paint bluePaint = new Paint(); 
    bluePaint.setColor(Color.BLUE); 

    int screenWidth = this.getWidth(); 
    int screenHeight = this.getHeight(); 

    canvas.drawCircle(screenWidth/2, -((screenWidth * 2) - (screenWidth/15)), (screenWidth * 2), blackPaint); 

    //Triangle 


    float mid = getWidth()/2; 
    float min = Math.min(getWidth(), getHeight()); 
    float fat = min/17; 
    float half = min/2; 

    redPaint.setStrokeWidth(fat); 
    redPaint.setStyle(Paint.Style.STROKE); 
    redPaint.setStyle(Paint.Style.FILL); 
    drawTriangle(mid, 35, half - 10, 30, 0); 
    canvas.drawCircle(mid, half - 10, 2, bluePaint); 
    canvas.drawCircle(mid-35, half+15, 2, bluePaint); 
    canvas.drawCircle(mid + 35, half + 15, 2, bluePaint); 



    super.onDraw(canvas); 

} 

public void drawTriangle(float x, int deltaX, float y, int deltaY, float deltaMove) { 

    **//this is the triangle which I want to animate** 

    Path path = new Path(); 
    path.reset(); 
    path.moveTo(x, y+deltaMove); 
    path.lineTo(x - deltaX, y + deltaY); 
    path.lineTo(x + deltaX, y + deltaY); 
    path.close(); 
    canvas.drawPath(path, redPaint); 

} 
} 

活動

在活動中我有一個查看頁面與addOnPageChangeListener.From上PageScrolled()我想動畫繪製traingle。我將如何訪問這是一個片段從myactivty

直接調用drawTriangle()在畫布上繪製的對象,並通過一個新的Canvas()給我一個NullPointerException

幫助和建議需要 謝謝

回答

0

您的中間片段應在ViewPager上設置OnPageChangeListener而不是在onPageScrolled中對活動調用接口方法。

你的活動應該實現一些頁面滾動界面。您可以製作自己的自定義界面,也可以重新使用OnPageChangeListener界面。該實現應該獲得對您的頂級片段的引用(在創建引用後保存引用或調用FragmentManager.findFragmentByTag())並調用頂級片段上的方法來設置onPageScrolled值。

您的頂部片段應該定義類似於onPageScrolled的方法,它可以接受活動中的頁面滾動值並存儲它,然後在片段的視圖上調用invalidate()

你的頂部片段應該有一個屬性,如private float mPosition,它存儲最後的位置值。

然後在您的頂部片段onDraw中,繪製三角形時請參閱mPosition屬性。