本页文章导读:
▪Java多态机制中的绑定守则 Java多态机制中的绑定规则
package com.example;
public class Base {
String var = "BaseVar"; // 实例变量
static String staticVar = "StaticBaseVar"; // 静态变量
void method() // 实例方法
{
System.out.println("Base method");.........
▪ 7.1.2 DatePicker组合案例详解 7.1.2 DatePicker结合案例详解
DatePicker是Android的日期设置控件。DatePicker类的继承图如下:java.lang.Object ↳android.view.View ↳android.view.ViewGroup ↳android.widget.FrameLayout ↳android.w.........
▪ 自动调整TextView字体大小以顺应文字长度&拖动一个角增大textView面积 自动调整TextView字体大小以适应文字长度&拖动一个角增大textView面积
效果是 当字数少的时候 字体最大,随着字数的增多字体逐渐减小。
import android.content.Context;
import android.graphics.Paint;
.........
[1]Java多态机制中的绑定守则
来源: 互联网 发布时间: 2014-02-18
Java多态机制中的绑定规则
1.对于一个引用类型的变量,Java编译器按照它声明的类型来处理.
例如在以下代码中,编译器认为who是Base类型的引用变量,不存在subVar成员变量和subMethod()方法,编译报错
如果要访问Sub类的成员,必须通过强制类型转换:
Base who = new Sub();
//把Base引用类型的who成员变量强制转换为Sub引用类型
//把引用变量转换为子类的类型称为向下转型,把引用变量转换为父类的类型称为向上转型
((Sub)who).subVar = "123";
((Sub)who).subMethod();
Java编译器允许在具有直接或间接继承关系的类之间进行类型转换,对于向上转型,Java编译器会自动进行,对于向下转型,需要进行强制类型转换
如果两种类型之间没有继续关系,即不在继承树的同一个继承分支上,那么Java编译器不允许进行类型转换
2.对于一个引用类型的变量,运行时Java虚拟机按照它实际引用的对象来处理
例如以下代码虽编译可通过,但运行时会抛出ClassCastException运行时异常
Base who = new Base(); //who引用Base类的实例
Sub s = (Sub)who; //运行时会抛出ClassCastException
在运行时,子类的对象可以转换为父类类型,而父类的对象实际上无法转换为子类类型
3, 在运行时环境中,通过引用类型变量来访问所引用对象的方法和属性时,Java虚拟机采用以下绑定规则:
1, 实例方法与引用变量实际引用的对象的方法绑定,这种绑定属于动态绑定,因为是在运行时由Java虚拟机动态决定的
2, 静态方法与引用变量所声明的类型的方法绑定,这种绑定属于静态绑定,因为实际上是在编译阶段就已经绑定
3, 成员变量(静态变量,实例变量)与引用变量所声明的类型的成员变量绑定,这种绑定属于静态绑定,因为实际上是在编译阶段就已经绑定
package com.example; public class Base { String var = "BaseVar"; // 实例变量 static String staticVar = "StaticBaseVar"; // 静态变量 void method() // 实例方法 { System.out.println("Base method"); } static void staticMethod() // 静态方法 { System.out.println("Static Base method"); } }
package com.example; public class Sub extends Base { String var = "SubVar"; // 实例变量 static String staticVar = "StaticSubVar"; // 静态变量 void method() // 隐藏父类的method()方法 { System.out.println("Sub method"); } static void staticMethod() // 隐藏父类的staticMethod()方法 { System.out.println("Static Sub method"); } String subVar = "Var only belonging to Sub"; void subMethod() { System.out.println("method only belonging to Sub"); } public static void main(String args[]) { // 引用变量who被声明为Base类型,引用Sub类的实例 Base who = new Sub(); // 成员变量(静态变量,实例变量)与引用变量所声明的类型(Base类型)的成员变量绑定 System.out.println("who.var = " + who.var); // 所以,打印Base类的var变量 System.out.println("who.staticVar = " + who.staticVar); // 所以,打印Base类的staticVar变量 // 实例方法与引用变量实际引用的对象(Sub对象)的方法绑定 who.method(); // 所以,打印Sub实例的method()方法 // 静态方法与引用变量所声明的类型(Base类型)的方法绑定 who.staticMethod(); // 所以,打印Base类的staticMethod()方法 } }
1.对于一个引用类型的变量,Java编译器按照它声明的类型来处理.
例如在以下代码中,编译器认为who是Base类型的引用变量,不存在subVar成员变量和subMethod()方法,编译报错
Base who = new Sub(); //引用变量who被声明为Base类型,引用Sub类的实例 who.subVar = "123"; //编译错,在Base类中没有subVar属性 who.subMethod(); //编译错,在Base类中没有submethod()方法
如果要访问Sub类的成员,必须通过强制类型转换:
Base who = new Sub();
//把Base引用类型的who成员变量强制转换为Sub引用类型
//把引用变量转换为子类的类型称为向下转型,把引用变量转换为父类的类型称为向上转型
((Sub)who).subVar = "123";
((Sub)who).subMethod();
Java编译器允许在具有直接或间接继承关系的类之间进行类型转换,对于向上转型,Java编译器会自动进行,对于向下转型,需要进行强制类型转换
如果两种类型之间没有继续关系,即不在继承树的同一个继承分支上,那么Java编译器不允许进行类型转换
2.对于一个引用类型的变量,运行时Java虚拟机按照它实际引用的对象来处理
例如以下代码虽编译可通过,但运行时会抛出ClassCastException运行时异常
Base who = new Base(); //who引用Base类的实例
Sub s = (Sub)who; //运行时会抛出ClassCastException
在运行时,子类的对象可以转换为父类类型,而父类的对象实际上无法转换为子类类型
3, 在运行时环境中,通过引用类型变量来访问所引用对象的方法和属性时,Java虚拟机采用以下绑定规则:
1, 实例方法与引用变量实际引用的对象的方法绑定,这种绑定属于动态绑定,因为是在运行时由Java虚拟机动态决定的
2, 静态方法与引用变量所声明的类型的方法绑定,这种绑定属于静态绑定,因为实际上是在编译阶段就已经绑定
3, 成员变量(静态变量,实例变量)与引用变量所声明的类型的成员变量绑定,这种绑定属于静态绑定,因为实际上是在编译阶段就已经绑定
[2] 7.1.2 DatePicker组合案例详解
来源: 互联网 发布时间: 2014-02-18
7.1.2 DatePicker结合案例详解
DatePicker是Android的日期设置控件。DatePicker类的继承图如下:
java.lang.Object
↳android.view.View
↳android.view.ViewGroup
↳android.widget.FrameLayout
↳android.widget.DatePicker
android.widget.DatePicker继承了android.widget.FrameLayout框架布局类。DatePicker例子如图7-7所示,从左到右是年、月、日的设置,改变年月日都会触发OnDateChanged事件,当点击“按钮”可以获得当前设置的时间。
图7-7 DatePicker
请参考代码清单7-6,完整代码请参考chapter7_1工程中chapter7_DatePicker代码部分。
【代码清单7-6】
Calendar.getInstance()会获得一个Calendar实例,这是一个日期实例,通过它的get(Calendar.YEAR)方法可以获得年,get(Calendar.MONTH)方法加1获得月, get(Calendar.DAY_OF_MONTH)方法获得日期。DataPicker控件的核心代码是init方法:
datePicker.init(c.get(Calendar.YEAR),c.get(Calendar.MONTH),c.get(Calendar.DAY_OF_MONTH), new DatePicker.OnDateChangedListener() {…}
在init方法中初始化DataPicker和事件的处理。
DataPicker的布局文件请参考代码清单7-7,完整代码请参考chapter7_1工程中datepicker_layout.xml代码部分(chapter7_1/res/layout/datepicker_layout.xml)。
【代码清单7-7】
出自《Android开发案例驱动教程》第七章
DatePicker是Android的日期设置控件。DatePicker类的继承图如下:
java.lang.Object
↳android.view.View
↳android.view.ViewGroup
↳android.widget.FrameLayout
↳android.widget.DatePicker
android.widget.DatePicker继承了android.widget.FrameLayout框架布局类。DatePicker例子如图7-7所示,从左到右是年、月、日的设置,改变年月日都会触发OnDateChanged事件,当点击“按钮”可以获得当前设置的时间。
图7-7 DatePicker
请参考代码清单7-6,完整代码请参考chapter7_1工程中chapter7_DatePicker代码部分。
【代码清单7-6】
public class chapter7_DatePicker extends Activity { private TextView mDateDisplay; private DatePicker datePicker; private Calendar c; private Button button; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.datepicker_layout); datePicker = (DatePicker) findViewById(R.id.datePicker); c = Calendar.getInstance(); mDateDisplay = (TextView) findViewById(R.id.datetextview); datePicker.init(c.get(Calendar.YEAR), c.get(Calendar.MONTH), c .get(Calendar.DAY_OF_MONTH), new DatePicker.OnDateChangedListener() { public void onDateChanged(DatePicker view, int year, int monthOfYear, int dayOfMonth) { mDateDisplay.setText("[" + year + "-" + (monthOfYear + 1) + "-" + dayOfMonth + "]" + "[" + view.getYear() + "-" + (view.getMonth() + 1) + "-" + view.getDayOfMonth() + "]"); } }); button = (Button) findViewById(R.id.Button01); button.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { mDateDisplay.setText(String.valueOf(datePicker.getYear()) + " - " + String.valueOf(datePicker.getMonth() + 1) + " - " + String.valueOf(datePicker.getDayOfMonth())); } }); } }
Calendar.getInstance()会获得一个Calendar实例,这是一个日期实例,通过它的get(Calendar.YEAR)方法可以获得年,get(Calendar.MONTH)方法加1获得月, get(Calendar.DAY_OF_MONTH)方法获得日期。DataPicker控件的核心代码是init方法:
datePicker.init(c.get(Calendar.YEAR),c.get(Calendar.MONTH),c.get(Calendar.DAY_OF_MONTH), new DatePicker.OnDateChangedListener() {…}
在init方法中初始化DataPicker和事件的处理。
DataPicker的布局文件请参考代码清单7-7,完整代码请参考chapter7_1工程中datepicker_layout.xml代码部分(chapter7_1/res/layout/datepicker_layout.xml)。
【代码清单7-7】
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/hello" /> <DatePicker android:id="@+id/datePicker" android:layout_width="wrap_content" android:layout_height="wrap_content"> </DatePicker> <TextView android:id="@+id/datetextview" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/hello" /> <Button android:text="按钮" android:id="@+id/Button01" android:layout_width="wrap_content" android:layout_height="wrap_content"></Button> </LinearLayout>
出自《Android开发案例驱动教程》第七章
[3] 自动调整TextView字体大小以顺应文字长度&拖动一个角增大textView面积
来源: 互联网 发布时间: 2014-02-18
自动调整TextView字体大小以适应文字长度&拖动一个角增大textView面积
效果是 当字数少的时候 字体最大,随着字数的增多字体逐渐减小。
拖动一个角增大textView面积
ImageView伸缩动画效果
http://edison-cool911.iteye.com/blog/870339
效果是 当字数少的时候 字体最大,随着字数的增多字体逐渐减小。
import android.content.Context; import android.graphics.Paint; import android.util.AttributeSet; import android.widget.TextView; public class CustomTextView extends TextView { private static float DEFAULT_MIN_TEXT_SIZE = 10; private static float DEFAULT_MAX_TEXT_SIZE = 20; // Attributes private Paint testPaint; private float minTextSize, maxTextSize; public CustomTextView(Context context, AttributeSet attrs) { super(context, attrs); initialise(); } private void initialise() { testPaint = new Paint(); testPaint.set(this.getPaint()); // max size defaults to the intially specified text size unless it is // too small maxTextSize = this.getTextSize(); if (maxTextSize <= DEFAULT_MIN_TEXT_SIZE) { maxTextSize = DEFAULT_MAX_TEXT_SIZE; } minTextSize = DEFAULT_MIN_TEXT_SIZE; }; /** * Re size the font so the specified text fits in the text box * assuming * the text box is the specified width. */ private void refitText(String text, int textWidth) { if (textWidth > 0) { int availableWidth = textWidth - this.getPaddingLeft() - this.getPaddingRight(); float trySize = maxTextSize; testPaint.setTextSize(trySize); while ((trySize > minTextSize) && (testPaint.measureText(text) > availableWidth)) { trySize -= 1; if (trySize <= minTextSize) { trySize = minTextSize; break; } testPaint.setTextSize(trySize); } this.setTextSize(trySize); } }; @Override protected void onTextChanged(CharSequence text, int start, int before, int after) { super.onTextChanged(text, start, before, after); refitText(text.toString(), this.getWidth()); } @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { if (w != oldw) { refitText(this.getText().toString(), w); } } }
拖动一个角增大textView面积
public class EditTextClass extends Activity implements OnTouchListener { private EditText txt; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); txt = (EditText) findViewById(YourEditTextId); txt.setOnTouchListener(this); } @Override public boolean onTouch(View v, MotionEvent event) { if(event.getX() >= txt.getWidth() - 5 && event.getX() <= txt.getWidth() event.getY() >= txt.getHeight() - 5 && event.getY() <= txt.getHeight()) { txt.setWidth(event.getX()); txt.setHeight(event.getY()); } return true; } }
ImageView伸缩动画效果
http://edison-cool911.iteye.com/blog/870339
1 楼
安轩之
2011-09-20
楼主,你写的是否有误???
最新技术文章: