2013-03-13 15 views
8

Ho creato una vista personalizzata per il calendario. Ho un metodo onDraw per disegnare il testo nel calendario. Voglio cambiare il colore del giorno Testo quando clicco su di esso. Come posso ottenerlo?Chiamare il metodo onDraw() di una vista personalizzata in Android

CalendarView.java:

package com.example.calendar_module; 

import java.util.Calendar; 

import android.app.ActionBar.LayoutParams; 
import android.content.Context; 
import android.content.res.Resources; 
import android.graphics.Canvas; 
import android.graphics.Color; 
import android.graphics.Rect; 
import android.graphics.drawable.Drawable; 
import android.util.AttributeSet; 
import android.util.MonthDisplayHelper; 
import android.view.MotionEvent; 
import android.widget.ImageView; 

public class CalendarView extends ImageView { 

private static int WEEK_TOP_MARGIN = 0; 
private static int WEEK_LEFT_MARGIN = 05; 
private static int CELL_WIDTH = 20; 
private static int CELL_HEIGH = 20; 
private static int CELL_MARGIN_TOP = 05; 
private static int CELL_MARGIN_LEFT = 29; 
private static float CELL_TEXT_SIZE; 
private static int CALENDAR_WIDTH; 
private static int CALENDAR_HEIGHT; 

private static final String TAG = "CalendarView"; 
private String[] mDayString = {"Sun","Mon","Tue","Wed","Thu","Fri","Sat"}; 
private Calendar mRightNow = null; 
private Drawable mWeekTitle = null; 
private Cell mToday = null; 
private Cell[][] mCells = new Cell[6][7]; 
private Cell[] mDayCells = new Cell[7]; 
private OnCellTouchListener mOnCellTouchListener = null; 
MonthDisplayHelper mHelper; 
Drawable mDecoration = null; 

public interface OnCellTouchListener { 
    public void onTouch(Cell cell); 
} 

public CalendarView(Context context) { 
    this(context, null); 
} 

public CalendarView(Context context, AttributeSet attrs) { 
    this(context, attrs, 0); 
} 

public CalendarView(Context context, AttributeSet attrs, int defStyle) { 
    super(context, attrs, defStyle); 
    mDecoration = context.getResources().getDrawable(R.drawable.typeb_calendar_today);  
    initCalendarView(); 
} 

private void initCalendarView() { 

    mRightNow = Calendar.getInstance(); 
    // prepare static vars 

    Resources res = getResources(); 
    WEEK_TOP_MARGIN = (int) res.getDimension(R.dimen.week_top_margin); 
    WEEK_LEFT_MARGIN = (int) res.getDimension(R.dimen.week_left_margin); 

    CELL_WIDTH = (int) res.getDimension(R.dimen.cell_width); 
    CELL_HEIGH = (int) res.getDimension(R.dimen.cell_heigh); 
    CELL_MARGIN_TOP = (int) res.getDimension(R.dimen.cell_margin_top); 
    CELL_MARGIN_LEFT = (int) res.getDimension(R.dimen.cell_margin_left); 
    //  CALENDAR_HEIGHT = 700; 
    //  CALENDAR_WIDTH = 700; 
    //   
    CALENDAR_HEIGHT = (int) res.getDimension(R.dimen.calendar_height); 
    CALENDAR_WIDTH = (int) res.getDimension(R.dimen.calendar_width); 

    System.out.println("Width and Hight :"+CALENDAR_WIDTH+" "+CALENDAR_HEIGHT); 
    System.out.println("Dimen Width and Height : "+R.dimen.calendar_width+" "+R.dimen.calendar_height); 

    CELL_TEXT_SIZE = res.getDimension(R.dimen.cell_text_size); 
    // set background 
    //  setImageResource(R.drawable.background); 
    mWeekTitle = res.getDrawable(R.drawable.calendar_week); 

    mHelper = new MonthDisplayHelper(mRightNow.get(Calendar.YEAR), mRightNow.get(Calendar.MONTH)); 


} 

private void initCells() { 

    class _calendar { 
     public int day; 
     public boolean thisMonth; 
     public _calendar(int d, boolean b) { 
      day = d; 
      thisMonth = b; 
     } 
     public _calendar(int d) { 
      this(d, false); 
     } 
    }; 
    _calendar tmp[][] = new _calendar[6][7]; 

    for(int i=0; i<tmp.length; i++) { 
     int n[] = mHelper.getDigitsForRow(i); 
     for(int d=0; d<n.length; d++) { 
      if(mHelper.isWithinCurrentMonth(i,d)) 
       tmp[i][d] = new _calendar(n[d], true); 
      else 
       tmp[i][d] = new _calendar(n[d]); 

     } 
    } 

    Calendar today = Calendar.getInstance(); 
    int thisDay = 0; 
    mToday = null; 
    if(mHelper.getYear()==today.get(Calendar.YEAR) && mHelper.getMonth()==today.get(Calendar.MONTH)) { 
     thisDay = today.get(Calendar.DAY_OF_MONTH); 
    } 


    // build cells 
    Rect Bound = new Rect(CELL_MARGIN_LEFT, CELL_MARGIN_TOP, CELL_WIDTH+CELL_MARGIN_LEFT, CELL_HEIGH+CELL_MARGIN_TOP); 
    //  for(int i=0 ; i < 7 ; i++) 
    //  { 
    //   
    //   mDayCells[i] = new Cell(mDayString[i],new Rect(Bound),CELL_TEXT_SIZE); 
    //   Bound.offset(CELL_WIDTH, 0); 
//   
//  } 
//  
//  Bound.offset(0, CELL_HEIGH);  // move to next row and first column 
//  Bound.left = CELL_MARGIN_LEFT; 
//  Bound.right = CELL_MARGIN_LEFT+CELL_WIDTH; 
//  

    for(int week=0; week<mCells.length; week++) { 
     for(int day=0; day<mCells[week].length; day++) 
     { 

      if(tmp[week][day].thisMonth) { 
       if(day==0 || day==6) 
        mCells[week][day] = new RedCell(tmp[week][day].day, new Rect(Bound), CELL_TEXT_SIZE); 
       else 
        mCells[week][day] = new Cell(tmp[week][day].day, new Rect(Bound), CELL_TEXT_SIZE); 
      } else { 

       mCells[week][day] = new GrayCell(tmp[week][day].day, new Rect(Bound), CELL_TEXT_SIZE); 
      } 

      Bound.offset(CELL_WIDTH, 0); // move to next column 

      // get today 
      if(tmp[week][day].day==thisDay && tmp[week][day].thisMonth) { 
       mToday = mCells[week][day]; 
       mDecoration.setBounds(mToday.getBound()); 
      } 
     } 

     Bound.offset(0, CELL_HEIGH); // move to next row and first column 
     Bound.left = CELL_MARGIN_LEFT; 
     Bound.right = CELL_MARGIN_LEFT+CELL_WIDTH; 

    }  
} 

@Override 
public void onLayout(boolean changed, int left, int top, int right, int bottom) { 
    //  Rect re = getDrawable().getBounds(); 
    //  WEEK_LEFT_MARGIN = CELL_MARGIN_LEFT = (right-left - re.width())/2; 
    //  mWeekTitle.setBounds(WEEK_LEFT_MARGIN, WEEK_TOP_MARGIN, WEEK_LEFT_MARGIN+mWeekTitle.getMinimumWidth(), WEEK_TOP_MARGIN+mWeekTitle.getMinimumHeight()); 

    initCells(); 
    super.onLayout(changed, left, top, right, bottom); 
} 

@Override 
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
    System.out.println("Width : "+CALENDAR_WIDTH); 
    System.out.println("Height : "+CALENDAR_HEIGHT); 
    setMeasuredDimension(CALENDAR_WIDTH, CALENDAR_HEIGHT); 
    //  setMeasuredDimension(100,200); 
} 

public void setTimeInMillis(long milliseconds) { 
    mRightNow.setTimeInMillis(milliseconds); 
    initCells(); 
    this.invalidate(); 
} 

public int getYear() { 
    return mHelper.getYear(); 
} 

public int getMonth() { 
    return mHelper.getMonth(); 
} 

public void nextMonth() { 
    mHelper.nextMonth(); 
    initCells(); 
    invalidate(); 
} 

public void previousMonth() { 
    mHelper.previousMonth(); 
    initCells(); 
    invalidate(); 
} 

public boolean firstDay(int day) { 
    return day==1; 
} 

public boolean lastDay(int day) { 
    return mHelper.getNumberOfDaysInMonth()==day; 
} 

public void goToday() { 
    Calendar cal = Calendar.getInstance(); 
    mHelper = new MonthDisplayHelper(cal.get(Calendar.YEAR), cal.get(Calendar.MONTH)); 
    initCells(); 
    invalidate(); 
} 

public Calendar getDate() { 
    return mRightNow; 
} 

@Override 
public boolean onTouchEvent(MotionEvent event) { 
    if(mOnCellTouchListener!=null){ 
     for(Cell[] week : mCells) { 
      for(Cell day : week) { 
       if(day.hitTest((int)event.getX(), (int)event.getY())) { 
        mOnCellTouchListener.onTouch(day); 
       }      
      } 
     } 
    } 
    return super.onTouchEvent(event); 
} 

public void setOnCellTouchListener(OnCellTouchListener p) { 
    mOnCellTouchListener = p; 
} 

@Override 
protected void onDraw(Canvas canvas) { 
    // draw background 
    super.onDraw(canvas); 
    mWeekTitle.draw(canvas); 

    // draw cells 
    for(Cell[] week : mCells) { 
     for(Cell day : week) { 
      day.draw(canvas);   
     } 
    } 

    // draw today 
    if(mDecoration!=null && mToday!=null) { 
     mDecoration.draw(canvas); 
    } 
} 



public class GrayCell extends Cell { 
    public GrayCell(int dayOfMon, Rect rect, float s) { 
     super(dayOfMon, rect, s); 
     mPaint.setColor(Color.LTGRAY); 
    }   
} 

private class RedCell extends Cell { 

    public RedCell(int dayOfMon, Rect rect, float s) { 
     super(dayOfMon, rect, s); 
     mPaint.setColor(0xdddd0000); 
    }   

} 


} 

Cell.java:

package com.example.calendar_module; 

    import android.graphics.Canvas; 
    import android.graphics.Paint; 
    import android.graphics.Rect; 
    import android.graphics.RectF; 
    import android.graphics.drawable.Drawable; 
    import android.util.Log; 

    public class Cell { 
private static final String TAG = "Cell"; 
protected Rect mBound = null; 
protected int mDayOfMonth = 1; // from 1 to 31 
protected Paint mPaint = new Paint(Paint.SUBPIXEL_TEXT_FLAG 
     |Paint.ANTI_ALIAS_FLAG); 
int dx, dy; 
protected String mDayString; 
private Cell cell ; 

public Cell(int dayOfMon, Rect rect, float textSize, boolean bold) { 
    mDayOfMonth = dayOfMon; 
    mBound = rect; 
    mPaint.setTextSize(textSize); 
    mPaint.setColor(Color.BLACK); 
    if(bold) mPaint.setFakeBoldText(true); 

    dx = (int) mPaint.measureText(String.valueOf(mDayOfMonth))/2; 
    dy = (int) (-mPaint.ascent() + mPaint.descent())/2; 
} 

public Cell(String day,Rect rect,float textSize,boolean bold) 
{ 
    mDayString = day; 
    mBound = rect; 
    mPaint.setTextSize(textSize); 
    mPaint.setColor(Color.BLACK); 
    if(bold) mPaint.setFakeBoldText(true); 

    dx = (int) mPaint.measureText(String.valueOf(mDayString))/2; 
    dy = (int) (-mPaint.ascent() + mPaint.descent())/2; 

} 

public Cell(String day , Rect rect , float textSize , int newColor) 
{ 
    mDayString = day; 
    mBound = rect; 
    mPaint.setTextSize(textSize); 
    mPaint.setColor(newColor); 


    dx = (int) mPaint.measureText(String.valueOf(mDayString))/2; 
    dy = (int) (-mPaint.ascent() + mPaint.descent())/2; 
} 

public Cell(int dayOfMon, Rect rect, float textSize) { 
    this(dayOfMon, rect, textSize, false); 
} 
public Cell(String day,Rect rect,float textSize) 
{ 
    this(day,rect,textSize,false); 
} 

protected void draw(Canvas canvas) { 
    canvas.drawText(String.valueOf(mDayOfMonth), mBound.centerX() - dx, mBound.centerY() + dy, mPaint); 
} 

public int getDayOfMonth() { 
    return mDayOfMonth; 
} 

public boolean hitTest(int x, int y) { 
    return mBound.contains(x, y); 
} 

public Rect getBound() { 
    return mBound; 
} 

public String toString() { 
    return String.valueOf(mDayOfMonth)+"("+mBound.toString()+")"; 
} 




} 

CalendarActivity.java

package com.example.calendar_module; 

import java.util.GregorianCalendar; 

import com.example.calendar_module.CalendarView.OnCellTouchListener; 

import android.app.Activity; 
import android.content.Intent; 
import android.graphics.Color; 
import android.graphics.Rect; 
import android.os.Bundle; 
import android.os.Handler; 
import android.text.format.DateUtils; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 
import android.widget.ListView; 
import android.widget.TextView; 
import android.widget.Toast; 

public class CalendarActivity extends Activity{ 

public static final String MIME_TYPE = "vnd.android.cursor.dir/vnd.example.calendar_module.date"; 
public static String mClickedDate, mClickedMonth; 
CalendarView mView = null; 
TextView mHit; 
Handler mHandler = new Handler(); 
private Button mNextButton; 
private Button mPreviousButton; 
private TextView mMonthText ; 
private int mMonthInt; 
private ListView mEventListView; 


/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    mView = (CalendarView)findViewById(R.id.calendar); 

    mEventListView = (ListView) findViewById(R.id.EventsList); 
    mEventListView.setAdapter(new BadgeAdapter(this)); 

    mView.setOnCellTouchListener(new OnCellTouchListener() { 

     @Override 
     public void onTouch(Cell cell) { 

      TextView mMonthText = (TextView)findViewById(R.id.MonthText); 
      mClickedDate = ""+cell.getDayOfMonth(); 
      mClickedMonth =""+mMonthText.getText(); 
//    System.out.println("Clicked date is : "+mClickedDate+" "+mClickedMonth); 
//    startActivity(new Intent(CalendarActivity.this,Event.class)); 

//    cell = new Cell(cell.getDayOfMonth(),new Rect(cell.getBound()),Color.MAGENTA); 

     } 
    }); 

    mNextButton = (Button) findViewById(R.id.NextMonth); 
    mPreviousButton = (Button) findViewById(R.id.PreviousMonth); 
    mMonthText = (TextView) findViewById(R.id.MonthText); 

    mMonthText.setText(DateUtils.getMonthString(mView.getMonth(), DateUtils.LENGTH_LONG)+", "+mView.getYear()); 

//  System.out.println("CurrentMonth is : "+mView.getMonth()); 

//  if(getIntent().getAction().equals(Intent.ACTION_PICK)) 
//   findViewById(R.id.hint).setVisibility(View.INVISIBLE); 
    mNextButton.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      mView.nextMonth(); 
      mMonthText.setText(DateUtils.getMonthString(mView.getMonth(), DateUtils.LENGTH_LONG)+", "+mView.getYear()); 

     } 
    }); 

    mPreviousButton.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      // TODO Auto-generated method stub 

      mView.previousMonth(); 
      mMonthText.setText(DateUtils.getMonthString(mView.getMonth(), DateUtils.LENGTH_LONG)+", "+mView.getYear()); 
     } 
    }); 

    System.out.println("Calendar View Height : "+mView.getHeight()); 

} 



private class RedCell extends Cell { 

    public RedCell(Cell cell) { 
     super(cell.getDayOfMonth(),new Rect(cell.getBound()), R.dimen.cell_text_size); 
     mPaint.setColor(Color.RED); 


    }   

    } 




} 

risposta

18

chiamata mView.invalidate(); nel metodo onClick() per quella vista. Questo chiamerà onDraw() (eventualmente), che quindi eseguirà il codice di disegno per la tua vista.

+0

Ciò consentirà anche di richiamare onDraw() della vista nell'attività principale. Basta trovare l'attività con il suo id e quindi modificare alcune variabili e quindi chiamare onDraw che consentirà al canvas di utilizzare quelle variabili modificate. – Donato

Problemi correlati