Вызов метода onDraw () пользовательского представления в Android

Я создал CustomView для календаря. У меня есть метод onDraw для рисования текста в календаре. Я хочу изменить цвет текста «День», когда нажимаю на него. Как я могу это достичь?

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); } } } 

Solutions Collecting From Web of "Вызов метода onDraw () пользовательского представления в Android"

Вызовите mView.invalidate(); В вашем методе onClick () для этого представления. Это вызовет onDraw() (в конечном итоге), которая затем запустит код чертежа для вашего представления.