2013-03-13 17 views
8

Utworzono niestandardowy widok kalendarza. Mam metodę onDraw do narysowania tekstu w kalendarzu. Chcę zmienić kolor dnia Tekst po kliknięciu na niego. Jak mogę to osiągnąć?Wywołanie metody onDraw() niestandardowego widoku w systemie 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); 


    }   

    } 




} 

Odpowiedz

18

połączeń mView.invalidate(); w sposobie tym widoku swojej onClick(). Spowoduje to wywołanie onDraw() (ostatecznie), co spowoduje uruchomienie kodu rysunku dla widoku.

+0

Umożliwi to również wywołanie onDraw() widoku w głównym działaniu. Po prostu znajdź działanie według jego id, a następnie zmodyfikuj niektóre zmienne, a następnie wywołaj polecenie onDraw, które pozwoli płótnie na wykorzystanie zmodyfikowanych zmiennych. – Donato

Powiązane problemy