• Android自己定义View之组合控件 ---- LED数字时钟


    先上图

    LEDView效果如图所看到的。

    之前看到一篇博客使用两个TextView实现了该效果。于是我想用自己定义控件的方式实现一个LEDView。使用时就可以直接使用该控件。

    採用组合控件的方式,将两个TextView叠放在一起。再使用digital-7.ttf字体来显示数据。从而达到LED的效果。代码例如以下:

    LEDView.class

    package ione.zy.demo;
    
    import java.io.File;
    import java.util.Calendar;
    import java.util.Date;
    import java.util.TimeZone;
    
    import android.annotation.SuppressLint;
    import android.content.Context;
    import android.content.res.AssetManager;
    import android.graphics.Typeface;
    import android.os.Handler;
    import android.util.AttributeSet;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.widget.LinearLayout;
    import android.widget.TextView;
    
    public class LEDView extends LinearLayout {
    
    	private TextView timeView;
    	private TextView bgView;
    	private static final String FONT_DIGITAL_7 = "fonts" + File.separator
    			+ "digital-7.ttf";
    
    	private static final String DATE_FORMAT = "%02d:%02d:%02d";
    	private static final int REFRESH_DELAY = 500;
    
    	private final Handler mHandler = new Handler();
    	private final Runnable mTimeRefresher = new Runnable() {
    
    		@Override
    		public void run() {
    			Calendar calendar = Calendar.getInstance(TimeZone
    					.getTimeZone("GMT+8"));
    			final Date d = new Date();
    			calendar.setTime(d);
    
    			timeView.setText(String.format(DATE_FORMAT,
    					calendar.get(Calendar.HOUR), calendar.get(Calendar.MINUTE),
    					calendar.get(Calendar.SECOND)));
    			mHandler.postDelayed(this, REFRESH_DELAY);
    		}
    	};
    
    	@SuppressLint("NewApi")
    	public LEDView(Context context, AttributeSet attrs, int defStyle) {
    		super(context, attrs, defStyle);
    		init(context);
    	}
    
    	public LEDView(Context context, AttributeSet attrs) {
    		super(context, attrs);
    		init(context);
    	}
    
    	public LEDView(Context context) {
    		super(context);
    		init(context);
    	}
    
    	private void init(Context context) {
    		LayoutInflater layoutInflater = LayoutInflater.from(context);
    
    		View view = layoutInflater.inflate(R.layout.ledview, this);
    		timeView = (TextView) view.findViewById(R.id.ledview_clock_time);
    		bgView = (TextView) view.findViewById(R.id.ledview_clock_bg);
    		AssetManager assets = context.getAssets();
    		final Typeface font = Typeface.createFromAsset(assets, FONT_DIGITAL_7);
    		timeView.setTypeface(font);// 设置字体
    		bgView.setTypeface(font);// 设置字体
    
    	}
    
    	public void start() {
    		mHandler.post(mTimeRefresher);
    	}
    
    	public void stop() {
    		mHandler.removeCallbacks(mTimeRefresher);
    	}
    }
    

    ledview.xml文件

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >
          <TextView  
            android:id ="@+id/ledview_clock_time"  
            android:layout_width ="wrap_content"  
            android:layout_height ="wrap_content"  
            android:layout_centerInParent="true"
            android:shadowColor ="#00ff00"  
            android:shadowDx ="0"  
            android:shadowDy ="0"  
            android:shadowRadius ="10"  
            android:textColor ="#00ff00"  
            android:textSize ="80sp" />  
            
        <TextView
            android:id ="@+id/ledview_clock_bg"   
            android:layout_width="wrap_content"  
            android:layout_height="wrap_content"  
            android:layout_centerInParent="true"
            android:layout_gravity="center"  
            android:text="@string/default_time"  
            android:textColor="#3300ff00"  
            android:textSize="80sp" /> 
    </RelativeLayout>


    控件使用Demo

    package ione.zy.demo;
    
    import android.os.Build;
    import android.os.Bundle;
    import android.view.Menu;
    import android.annotation.SuppressLint;
    import android.annotation.TargetApi;
    import android.app.ActionBar;
    import android.app.Activity;
    
    @TargetApi(Build.VERSION_CODES.HONEYCOMB)
    public class LEDActivity extends Activity {
    
    	private LEDView ledView;
    
    	@SuppressLint("NewApi")
    	@Override
    	protected void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.activity_led);
    		ledView = (LEDView) findViewById(R.id.ledview);
    		
    		  ActionBar actionBar = getActionBar();  
    		  actionBar.setDisplayHomeAsUpEnabled(true); 
    	}
    
    	@Override
    	protected void onResume() {
    		super.onResume();
    		ledView.start();
    	}
    
    	@Override
    	protected void onStop() {
    		super.onStop();
    		ledView.stop();
    	}
    	
    	@Override
    	public boolean onCreateOptionsMenu(Menu menu) {
    		getMenuInflater().inflate(R.menu.activity_led, menu);
    		return true;
    	}
    
    }
    


    activity_led.xml

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".LEDActivity"
        android:background="@color/black" >
    
       <ione.zy.demo.LEDView 
            android:id="@+id/ledview"
            android:layout_width="wrap_content"  
            android:layout_height="wrap_content"  
            android:layout_centerInParent="true"
            android:layout_gravity="center"  />  
    
    </RelativeLayout>


    下载Demo


  • 相关阅读:
    C# Serializable(转)
    ASP.NET 2.0中构造个性化网页 (转)
    ASP如何限定中英文混合的文字输出字数?
    关于clientHeight、offsetHeight、scrollHeight
    无法删除,打开的文件夹
    学习.Net的经典网站(转)
    SQL注入漏洞全接触进阶篇
    关于robots.txt
    SQL注入漏洞全接触入门篇
    关于zend解密的程序
  • 原文地址:https://www.cnblogs.com/lxjshuju/p/7020015.html
Copyright © 2020-2023  润新知